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.
Раздел «Ошибки» был отредактирован путем при
pthread_mutexattr_getprioceiling, pthread_mutexattr_setprioceiling
Имя
pthread_mutexattr_getprioceiling, pthread_mutexattr_setprioceiling
Синопсис
THR #include
int pthread_mutexattr_getprioceiling (
const pthread_mutexattr_t *restrict attr, int *restrict
pthread_mutexattr_t
Описание
Функции pthread_mutexattr_getprioceiling() и pthread_mute-xattr_setprioceiling () используются для считывания и установки соответственно атрибута
Атрибут
Значение атрибута
Возвращаемые значения
При успешно
Ошибки
Функции pthread_mutexattr_getprioceiling () и pthread_mutexattr_setprioceiling () могут завершиться неудачно, если:
[EINVAL] значение, заданное пара
[EPERM] инициатор вызова не обладает привеле