130 likes | 402 Views
Семафоры-счетчики POSIX. Программирование с использованием POSIX thread library. Семафоры-счетчики. POSIX Realtime Extension (1003.1b-1993/1003.1i-1995) Сборка в Solaris требует ключа –lrt В Linux включены в libpthread.so. Неименованные семафоры. cc [ flags] file –lrt [ libraries ]
E N D
Семафоры-счетчики POSIX Программирование с использованием POSIX thread library
Семафоры-счетчики • POSIX Realtime Extension (1003.1b-1993/1003.1i-1995) • Сборка в Solaris требует ключа –lrt • В Linux включены в libpthread.so
Неименованные семафоры cc [ flags] file –lrt [ libraries ] #include <semaphore.h> int sem_init(sem_t *sem, int pshared, unsigned int value); int sem_destroy(sem_t *sem);
Операции над семафорами cc [ flags] file –lrt [ libraries ] #include <semaphore.h> 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 <semaphore.h> int sem_getvalue( sem_t *restrict sem, int *restrict sval);
Применение – задача производитель-потребитель void thread1() { while(1) { sem_wait(&a); print(…); sem_post(&b); } } sem_init(&a, 0, 0); sem_init(&b, 0, 1); void thread2() { while(1) { sem_wait(&b); print(…); sem_post(&a); } }
Именованные семафоры cc [ flags] file –lrt [ libraries ] #include <semaphore.h> 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 <semaphore.h> 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 <semaphore.h> int sem_unlink(const char * name);
sem_unlink • Уничтожает имя семафора • Семафор уничтожается, когда все процессы, использовавшие его, исполнят sem_close(3rt), exit(2) или exec(2) • Sem_unlink не ожидает уничтожения семафора