Я немного смущен Linux-интерфейсом sem_unlink(), в основном, когда или почему его называют. Я использовал семафоры в Windows уже много лет. В Windows после закрытия последнего дескриптора именованного семафора система удаляет основной объект ядра. Но в Linux вам, разработчику, нужно удалить объект ядра, вызвав sem_unlink(). Если вы не сохраняете объект ядра в папке /dev/shm.
Проблема, с которой я сталкиваюсь, если процесс A вызывает sem_unlink(), в то время как процесс B блокирует семафор, он немедленно уничтожает семафор, и теперь процесс B больше не "защищен" семафором, когда/если процесс C приходит вдоль. Что еще, справочная страница сбивает с толку в лучшем случае:
"Имя семафора немедленно удаляется. Семафор уничтожается, как только все остальные процессы, у которых открыт семафор, закрывают его.
Как он может немедленно уничтожить объект, если ему придется ждать, пока другие процессы закрывают семафор?
Ясно, что я не понимаю правильное использование объектов семафора в Linux. Спасибо за любую помощь. Ниже приведен пример кода, который я использую для проверки этого.
int main(void)
{
sem_t *pSemaphore = sem_open("/MyName", O_CREAT, S_IRUSR | S_IWUSR, 1);
if(pSemaphore != SEM_FAILED)
{
if(sem_wait(pSemaphore) == 0)
{
// Perform "protected" operations here
sem_post(pSemaphore);
}
sem_close(pSemaphore);
sem_unlink("/MyName");
}
return 0;
}