Параллельное и распределенное программирование на С++ (Хьюз, Хьюз) - страница 442

Использование общей памяти и синхронизация процессов

Существование функций распределения памяти в этом томе стандарта IEEE Std 1003.1-2001 дает приложению возможность выделять память объектам синхронизации из того раздела, который доступен многим процессам (а следовательно, и потокам многих процессов).

Чтобы реализовать такую возможность при эффективной поддержке обычного (т.е. однопроцессорного) случая, был определен атрибут process-shared.

Если реализация по д держивает опцию _POSIX_THREAD_PROCESS_SHARED, то атрибут process-shared м ожно использовать для индикации того, что к мьютексам или условным переменным могут получать доступ потоки сразу нескольких процессов.

Для того чтобы объекты синхронизации по у м олчанию создавались в са м ой эффективной фор м е, для атрибута process-shared в качестве стандартного было выбрано значение PTHREAD_PROCESS_PRIVATE. Пере м енные синхронизации, которые инициализированы значение м PTHREAD_PROCESS_PRIVATE атрибута process-shared, м огут обрабатываться потока м и только в то м процессе, в которо м была выполнена инициализации этих пере м енных. Пере м енные синхронизации, которые инициализированы значение м PTHREAD_PROCESS_SHARED атрибута process-shared, м огут обрабатываться любым потоком в любом процессе, который имеет к ним доступ. В частности, эти процессы могут существовать независимо от процесса инициализации. Например, следующий код реализует простой семафор-счетчик в общедоступном файле, который может быть использован многими процессами.

>/* sem.h */

>struct semaphore {

>pthread_mutex_t lock;

>pthread_cond_t nonzero;

>unsigned count;

>};

>typedef struct semaphore semaphore_t;

>semaphore_t *semaphore_create (char *semaphore_name);

>semaphore_t *semaphore_open (char *semaphore_name);

>void semaphore_post (semaphore_t *semap);

>void semaphore_wait (semaphore_t *semap); void semaphore_close (semaphore_t *semap);

>/* sem.c */

>#include #include #include #include #include #include 11 sem .h»

>semaphore_t *

>semaphore_create (char * semaphore_name) t

>int fd;

>semaphore_t * semap; pthread_mutexattr_t psharedm;

>pthread_condattr_t psharedc;

>fd = open(semaphore_name, O_RDWR | O_CREAT | O_EXCL, Оббб); if (fd <0)

>return (NULL); (void) ftruncate (fd, sizeof (semaphore_t)); (void) pthread_mutexattr_init (&psharedm); (void) pthread_mutexattr_setpshared(&psharedm,

>PTHREAD_PROCESS_SHARED) ;

>(void) pthread_condattr_init (&psharedc); (void) pthread_condattr_setpshared (&psharedc

>PTHREAD_PROCESS_SHARED);