이름이 지정되지 않은 POSIX 세마포어의 초기화를 동기화하는 방법은 무엇입니까?

이름이 지정되지 않은 POSIX 세마포어의 초기화를 동기화하는 방법은 무엇입니까?

여러 프로세스에서 명명되지 않은 POSIX 세마포어를 사용하려면 공유 메모리의 일부에 대한 액세스를 생성/획득해야 합니다. 그런 다음 프로세스는 sem_init공유 메모리에 대한 참조를 첫 번째 인수로 사용하여 세마포를 호출하여 초기화해야 합니다. 하지만 이 작업은 한 번만 허용됩니다!

POSIX설명하다:

이미 초기화된 세마포어를 초기화하려고 하면 정의되지 않은 동작이 발생합니다.

문제는 세마포어가 존재하고 초기화되었는지 여부를 원자적으로 테스트하고, 존재하지 않으면 초기화할 방법이 없다는 것입니다.

세마포어가 초기화되었는지 여부를 나타내기 위해 단순히 공유 메모리에 부울 플래그를 추가하고 싶은 유혹을 느낄 수도 있지만 이는 분명히 경쟁 조건을 생성할 것입니다. 세마포어를 사용할 때 확실히 보고 싶지 않은 것입니다 :)

XSI(System V라고도 함) 세마포어는 경합 없이 올바르게 초기화하기 위해 다소 복잡한 방법이 필요하지만 안전하게 만들 수 있습니다(예를 들어 APUE의 구현 참조). 또한 명명된 POSIX 세마포는 플래그를 sem_open받아들이고 O_EXCL세마포의 값을 초기화할 수도 있기 때문에 이 문제를 나타내지 않습니다 .

그렇다면 세마포어를 초기화한 후에만 다른 프로세스를 동기화하거나 분기하기 위해 다른 방법에 의존하지 않고 프로세스 간에 명명되지 않은 POSIX 세마포어를 안전하게 공유하려면 어떻게 해야 할까요? 내가 무엇을 놓치고 있나요?

관련 정보