>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.
Раздел «Ошибки» был отредактирован путем при