#c #linux #semaphore #shared-memory
#c #linux #семафор #разделяемая память
Вопрос:
У меня есть 2 программы (процессы). Один процесс записывает в разделяемую память, а другой ее считывает. Итак, мой подход был таким: изначально значение общей памяти равно 0. Итак, процесс 1 записывает только тогда, когда значение равно 0. Теперь процесс 1 записал в shm какое-то другое значение и «ждет», пока значение не станет 0. Процесс 2 считывает shm и записывает в него 0. Под ожиданием я подразумеваю цикл while(1).
Мой вопрос в том, подходит ли этот подход или я могу улучшить какой-либо другой подход с точки зрения использования ЦП и памяти?
Комментарии:
1. Возможно, нам потребуется узнать больше о цели, но я бы посоветовал прочитать
unix sockets
иmessage queues
. Оба они являются механизмами межпроцессной связи (IPC), такими как разделяемая память.2. `While (1)` никогда не заканчивается.
3. Я вырываюсь из него, когда условие удовлетворяет
4. Ожидание занятости , вероятно, не то, что вы хотите здесь. Вероятно, вам следует использовать некоторый механизм синхронизации, предоставляемый вашей ОС.
5. Я использовал синхронизацию. Но моя проблема в том, что 1-й процесс не может записывать, пока 2-й не прочитает его. Только после того, как 2-й процесс прочитал, 1-й процесс будет записывать….
Ответ №1:
Упомянутая проблема, известная как проблема синхронизации процессов, и данная логика — это не что иное, как подход к проблеме ожидания, который является очень основным решением.
Прочитайте проблему производителя-потребителя, которая похожа на данную проблему.
Для этого есть несколько лучших решений, чем ожидание, например:
Блокировка вращения, семафор и т. Д.
Вы можете получить базовые знания обо всем этом отсюда
Надеюсь, это поможет!!
Комментарии:
1. Если я одновременно пишу в одном процессе и читаю в другом процессе, я могу получить грязные данные? В Windows, если это имеет значение.
Ответ №2:
Я думаю, что это нормально, но проблема возникает, когда оба процесса записывают в блок общей памяти. В то время вы могли бы использовать семафор для синхронизации двух процессов, позволяя по одному записывать в общий ресурс / блок памяти. Вы можете найти информацию о семафорах, нажав [здесь] (https://en.wikipedia.org/wiki/Semaphore_ (программирование)