Как защитить строку символов в разделяемой памяти между двумя процессами? - PullRequest
1 голос
/ 10 августа 2011

У меня есть часть общей памяти, которая содержит строку символов и целое число между двумя процессами.

Процесс A записывает в него, а Процесс B читает его (а не наоборот)

Каков наиболее эффективный и эффективный способ убедиться, что Процесс А не обновляет (не записывает в него) то же самое время, что Процесс Б читает его? (Должен ли я просто использовать флаги в общей памяти, использовать семафоры, критический раздел ....)

Если бы вы указали мне правильное направление, я был бы признателен.

Спасибо.

Windows, C ++

Ответы [ 4 ]

3 голосов
/ 10 августа 2011

Нельзя использовать Критическое сечение , поскольку они могут использоваться только для синхронизации между потоками в одном и том же процессе.Для межпроцессной синхронизации вам необходимо использовать Mutex или Семафор .Разница между этими двумя заключается в том, что первый позволяет владеть ресурсом только одному потоку, тогда как последний может разрешить одновременное владение ресурсом до максимального числа (указанного при создании).

В вашем случае aМьютекс кажется подходящим.

2 голосов
/ 10 августа 2011

Поскольку у вас есть два процесса, вам необходим объект синхронизации между процессами.Я думаю, это означает, что вам нужно использовать мьютекс .

1 голос
/ 10 августа 2011

Поскольку вы говорите о двух процессах, общесистемные мьютексы будут работать, и в Windows они есть. Тем не менее, они не обязательно являются наиболее эффективным способом.

Если вы можете поместить больше вещей в общую память, то передача данных с помощью атомарных операций над флагами в этой памяти должна быть наиболее эффективной. Например, вы можете использовать блокированные функции для реализации алгоритма Деккера (вы, вероятно, захотите использовать что-то вроде YieldProcessor(), чтобы избежать ожидания ожидания).

1 голос
/ 10 августа 2011

Объект мьютекса облегчает защиту от скачек данных и позволяет поточно-ориентированная синхронизация данных между потоками. Нить получает владение объектом мьютекса путем вызова одной из функций блокировки и отказывается от владения, вызывая соответствующую функцию разблокировки.

Если вы используете boost thread, вы можете использовать его мьютекс и блокировку, подробнее читайте по ссылке ниже:

http://www.boost.org/doc/libs/1_47_0/doc/html/thread/synchronization.html#thread.synchronization.mutex_types

...