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

>semap = (semaphore_t *) mmap (NULL, sizeof (semaphore_t),

>PR0T_READ | PROT_WRITE, MAP_SHARED, fd, О);

>close (fd);

>(void) pthread_mutex_init (&semap->lock, &psharedm);

>(void) pthread_cond_init (&semap->nonzero, &psharedc); semap->count = 0; return (semap);

>}

>semaphore_t *

>semaphore_open (char *semaphore_name) {

>int fd;

>semaphore_t *semap;

>fd = open (semaphore_name, O_RDWR, 0666); if (fd <0)

>return (NULL);

>semap = (semaphore_t *) mmap (NULL, sizeof (semaphore_t),

>PROT_READ | PROT_WRITE, MAP_SHARED, f d, 0) ;

>close (fd); return (semap);

>}

>void

>semaphore_post (semaphore_t *semap) {

>pthread_mutex_lock (&semap->lock); if (semap->count == 0)

>pthread_cond_signal (&semapx->nonzero); semap->count++;

>pthread_mutex_unlock (&semap->lock);

>}

>void

>semaphore_wait (semaphore_t * semap) {

>pthread_mutex_lock (&semap->lock); while (semap->count == 0)

>pthread_cond_wait (&semap->nonzero, &semap->lock); semap->count--;

>pthread_mutex_unlock (&semap->lock);

>}

>void

>semaphore_close (semaphore_t *semap) {

>munmap ((void *) semap, sizeof (semaphore_t));

>}

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

/* create.c */

# include «pthread. h»

#include «sem.h»

int main() {

semaphore_t * semap;

semap = semaphore_create («/ tmp/semaphore») ; if (semap == NULL)

exit(l); semaphore_close (semap) ,-return (0);

}

/* post */

# include «pthread. h»

#include «sem.h»

int main() {

semaphore_t *semap;

semap = semaphore_open ("/tmp/semaphore»);

if (semap == NULL)

exit (1);

semaphore_post (semap);

semaphore_close (semap);

return (0);

}

/* wait */

#include «pthread.h»

#include «sem.h» int

main () {

semaphore_t *semap;

semap = semaphore_open ("/tmp/semaphore >11 ); if (semap == NULL)

exit (1); semaphore_wait (semap); semaphore_close (semap); return (0);

}

Будущие направления

Отсутствуют.

Смотри также

pthread_cond_destroy (), pthread_create (), pthread_mutex_destroy (), pthread_mutexattr_destroy (), том Base Definitions стандарта IEEE Std 1003.1-2001,.

Последовательность внесения изменений

Функции впервые реализованы в выпуске Issue 5. Включены для согласования с расширением POSIX Threads Extension.

Issue 6

Функции pthread_mutexattr_destroy() и pthread_mutexattr_init () отмечены как часть опции Threads.

Раздел «Ошибки» был отредактирован путем при