Один процесс записывает данные, в то время как другой считывает общую память

#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_ (программирование)