Семафор с общей памятью - PullRequest
       41

Семафор с общей памятью

1 голос
/ 11 сентября 2009

У меня запущено 10 процессов, каждый из которых записывает один и тот же файл. Я не хочу нескольких писателей, поэтому в основном я ищу мьютекс / двоичный семафор для защиты файловых записей. Проблема в том, что я не могу разделить семафор между 10 процессами, поэтому я рассматриваю использование общей памяти между 10 процессами и размещение семафора в общей памяти, чтобы каждый процесс мог к нему обращаться.

Может кто-нибудь указать мне на документацию по этому вопросу в C / C ++ для Unix? Пример кода для использования этой структуры был бы великолепен.

Спасибо

Ответы [ 5 ]

3 голосов
/ 11 сентября 2009

Поместить семафор в разделяемую память - не лучшее решение этой проблемы (если это вообще сработает). Вы должны исследовать блокировку файлов, которая является функцией UNIX, специально разработанной для обеспечения исключительности среди авторов файлов.

В частности, проверить:

Более подробный материал см. В Расширенное программирование в среде UNIX, раздел 14.3

2 голосов
/ 11 сентября 2009

Вы можете использовать мьютексы PTHREAD.При инициализации мьютекса вам нужно использовать функцию pthread_mutexattr_setpshared , чтобы сделать мьютекс общим для всех процессов, а затем поместить его в общую память.Все процессы могут подключиться к общей памяти и затем получить доступ к мьютексу.

Также вы можете добавить дополнительные атрибуты в SHM в зависимости от ваших требований к блокировке (рекурсивный и т.

2 голосов
/ 11 сентября 2009

Взгляните на UNIX Network Programming Vol. 2 У. Ричарда Стивенса.

Это лучшая книга, написанная на эту тему.

1 голос
/ 11 сентября 2009

Похоже, вам лучше использовать flock(2):

flock(fd, LOCK_EX);
n = write(fd, buf, count);
flock(fd, LOCK_UN);
1 голос
/ 11 сентября 2009

Как насчет использования UNIX IPC для создания общей очереди. Один процесс читает очередь и записывает в файл, все остальные процессы помещают данные в очередь.

...