如何只初始化一次信号量?

时间:2017-04-04 03:29:18

标签: c multithreading initialization posix semaphore

我目前正在处理的工作需要在一个函数内初始化几个posix信号量,这个函数将运行多个进程,并且信号量将与另一个运行这些进程的函数共享。我如何解决这个问题,以便信号量只由一个线程创建一次,而其余的只打开它们?我似乎无法找到任何关于如何在任何地方这样做的事情。

我可以在这个主题上找到关于如何使用sem_wait()和sem_post()函数,但没有特定于我的问题。我还必须确保文件只创建一次并由其他进程打开,但是可以检查文件是否已由access()函数创建。是否有类似信号量的信息?

任何帮助解释如何做到这一点将不胜感激。

1 个答案:

答案 0 :(得分:0)

  

可以检查文件是否已由access()函数

创建

似乎只能检查它。实际上,这不起作用。

在您通过调用access()并在尝试自己创建之前验证它不存在之后,可以创建另一个执行线程。这称为竞争条件

这就是为什么在O_EXCL | O_CREAT open系统调用中使用sem_open个标记的原因。此操作是原子:它验证文件/信号量不存在,并在一个不可分割的操作中创建一个新文件/信号量。如果操作返回失败并且errno设置为EEXIST,则文件/信号量已存在。

这自然只适用于命名信号量(使用sem_open创建的信号量)。应该在启动使用它的线程之前创建一个未命名的信号量(使用sem_init创建的信号量),或者应该通过其他方式同步其创建。

相关问题