1 / 13

Семафоры-счетчики POSIX

Семафоры-счетчики POSIX. Программирование с использованием POSIX thread library. Семафоры-счетчики. POSIX Realtime Extension (1003.1b-1993/1003.1i-1995) Сборка в Solaris требует ключа –lrt В Linux включены в libpthread.so. Неименованные семафоры. cc [ flags] file –lrt [ libraries ]

nerita
Download Presentation

Семафоры-счетчики POSIX

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Семафоры-счетчики POSIX Программирование с использованием POSIX thread library

  2. Семафоры-счетчики • POSIX Realtime Extension (1003.1b-1993/1003.1i-1995) • Сборка в Solaris требует ключа –lrt • В Linux включены в libpthread.so

  3. Неименованные семафоры 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);

  4. Операции над семафорами 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);

  5. sem_getvalue cc [ flags] file –lrt [ libraries ] #include <semaphore.h> int sem_getvalue( sem_t *restrict sem, int *restrict sval);

  6. Применение – задача производитель-потребитель 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); } }

  7. Именованные семафоры cc [ flags] file –lrt [ libraries ] #include <semaphore.h> sem_t *sem_open(const char *name, int oflag, /* unsigned long mode, unsigned int value */ ...);

  8. sem_open(3RT) • Открывает или создает именованный семафор. • Флаги – O_CREAT и O_EXCL, аналогичны одноименным флагам open(2) • При использовании O_CREAT необходимо передать еще два параметра – маску прав доступа и начальное значение семафора

  9. sem_close(3RT) cc [ flags] file –lrt [ libraries ] #include <semaphore.h> int sem_close(sem_t *sem);

  10. sem_close(3RT) • Закрывает семафор • Неявный sem_close происходит при exit(2), exec(2)

  11. Именованные семафоры • Всегда разделяемые (доступны для межпроцессного взаимодействия) • Должны закрываться sem_close(3RT) • Набор операций тот же, что и над неименованным семафором (sem_post(3RT), sem_wait(3RT), sem_trywait(3RT), sem_getvalue(3RT)) • Имя должно начинаться с ‘/’ • Имена могут (но не обязаны) быть видны в файловой системе. В Solaris 10 не видны • Уничтожаются при помощи sem_unlink(3RT)

  12. sem_unlink cc [ flags] file –lrt [ libraries ] #include <semaphore.h> int sem_unlink(const char * name);

  13. sem_unlink • Уничтожает имя семафора • Семафор уничтожается, когда все процессы, использовавшие его, исполнят sem_close(3rt), exit(2) или exec(2) • Sem_unlink не ожидает уничтожения семафора

More Related