OS X의 sem_init
pthread와 semaphore 라이브러리를 사용하는 코드를 만들고 있습니다.그sem_initUbuntu 머신에서는 정상적으로 동작하지만 OS X에서는sem_init함수는 전혀 효과가 없습니다.도서관에 무슨 문제가 있나요 아니면 다른 방법이 있나요?이것이 테스트에 사용하는 코드입니다.
sem_t sem1;
sem_t sem2;
sem_t sem3;
sem_t sem4;
sem_t sem5;
sem_t sem6;
sem_init(&sem1, 1, 1);
sem_init(&sem2, 1, 2);
sem_init(&sem3, 1, 3);
sem_init(&sem4, 1, 4);
sem_init(&sem5, 1, 5);
sem_init(&sem6, 1, 6);
값은 랜덤 수치로 나타나며 다음 시간 이후에도 변경되지 않습니다.sem_init불러.
이름 없는 세마포어는 지원되지 않으므로 이름 있는 세마포를 사용해야 합니다.
이름 없는 세마포어 대신 이름 있는 세마포를 사용하려면sem_open대신sem_init, 및 사용sem_close그리고.sem_unlink대신sem_destroy.
현재 OS X의 이름 있는 세마포어보다 좋은 솔루션은 Grand Central Dispatch의 dispatch_semaphore_t입니다.이름 없는 POSIX 세마포어처럼 작동합니다.
세마포를 초기화합니다.
#include <dispatch/dispatch.h>
dispatch_semaphore_t semaphore;
semaphore = dispatch_semaphore_create(1); // init with value of 1
대기 및 투고(신호):
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
...
dispatch_semaphore_signal(semaphore);
파기:
dispatch_release(semaphore);
헤더 파일이 잘 문서화되어 있어서 사용하기 쉬웠습니다.
소스에서의 sem_init 구현을 보면 오류가 반환될 뿐이며 sem_open과 같은 다른 bsd fns 중 일부는 아직 구현되어 있습니다.
semphore_create 및 semaphore_wait 등의 fn을 사용하여 사용자 공간에서 "비권장" posix fns 및 libdispatch/GCD 콜을 모두 사용합니다.항상 커널/OS를 사용하는 구식 sema를 원하는 경우 직접 사용할 수 있지만 내부적으로 원자 카운터를 사용하고 대기해야 하는 경우에만 커널/OS를 호출하는 GCD와 같은 제품이 좋습니다.
언급URL : https://stackoverflow.com/questions/1413785/sem-init-on-os-x
'source' 카테고리의 다른 글
| jsonpath를 사용하여 멤버 수를 어떻게 계산합니까? (0) | 2022.12.03 |
|---|---|
| 예외에 정보를 추가하시겠습니까? (0) | 2022.12.03 |
| C 표준 라이브러리의 기능을 위험하게 하는 것은 무엇이며, 대체 방법은 무엇입니까? (0) | 2022.11.24 |
| Python에서 확장자가 .txt인 디렉토리에서 모든 파일 찾기 (0) | 2022.11.24 |
| MySQL 계층 재귀 쿼리를 만드는 방법 (0) | 2022.11.24 |