Семафоры-счетчики POSIX Программирование с использованием POSIX thread library
Семафоры-счетчики POSIX Realtime Extension (1003.1b- 1993/1003.1i-1995) Сборка в Solaris требует ключа –lrt В Linux включены в libpthread.so
Неименованные семафоры cc [ flags] file –lrt [ libraries ] #include int sem_init(sem_t *sem, int pshared, unsigned int value); int sem_destroy(sem_t *sem);
Операции над семафорами cc [ flags] file –lrt [ libraries ] #include int sem_post(sem_t *sem); int sem_wait(sem_t *sem); int sem_trywait(sem_t *sem);
sem_getvalue cc [ flags] file –lrt [ libraries ] #include int sem_getvalue( sem_t *restrict sem, int *restrict sval);
Применение – задача производитель-потребитель void thread1() { while(1) { sem_wait(&a); print(…); sem_post(&b); } void thread2() { while(1) { sem_wait(&b); print(…); sem_post(&a); } sem_init(&a, 0, 0); sem_init(&b, 0, 1);
Именованные семафоры cc [ flags] file –lrt [ libraries ] #include sem_t *sem_open(const char *name, int oflag, /* unsigned long mode, unsigned int value */...);
sem_open(3RT) Открывает или создает именованный семафор. Флаги – O_CREAT и O_EXCL, аналогичны одноименным флагам open(2) При использовании O_CREAT необходимо передать еще два параметра – маску прав доступа и начальное значение семафора
sem_close(3RT) cc [ flags] file –lrt [ libraries ] #include int sem_close(sem_t *sem);
sem_close(3RT) Закрывает семафор Неявный sem_close происходит при exit(2), exec(2)
Именованные семафоры Всегда разделяемые (доступны для межпроцессного взаимодействия) Должны закрываться sem_close(3RT) Набор операций тот же, что и над неименованным семафором (sem_post(3RT), sem_wait(3RT), sem_trywait(3RT), sem_getvalue(3RT)) Имя должно начинаться с / Имена могут (но не обязаны) быть видны в файловой системе. В Solaris 10 не видны Уничтожаются при помощи sem_unlink(3RT)
sem_unlink cc [ flags] file –lrt [ libraries ] #include int sem_unlink(const char * name);
sem_unlink Уничтожает имя семафора Семафор уничтожается, когда все процессы, использовавшие его, исполнят sem_close(3rt), exit(2) или exec(2) Sem_unlink не ожидает уничтожения семафора