source

OS X의 sem_init

bestscript 2022. 11. 24. 23:42

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와 같은 제품이 좋습니다.

https://github.com/apple/darwin-xnu/blob/a1babec6b135d1f35b2590a1990af3c5c5393479/bsd/kern/posix_sem.c

언급URL : https://stackoverflow.com/questions/1413785/sem-init-on-os-x