【问题标题】:How to initialize semaphore only once?如何只初始化一次信号量?
【发布时间】:2017-04-04 03:29:18
【问题描述】:

我目前正在处理的工作需要在多个进程将运行的函数内部初始化几个 posix 信号量,并且这些信号量将与这些进程也将运行的另一个函数共享。我该怎么做才能使信号量只由一个线程创建一次,而其余的只打开它们?我似乎无法在任何地方找到有关如何执行此操作的任何信息。

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

任何帮助解释这是如何完成的将不胜感激。

【问题讨论】:

  • 在启动它们之前在线程外部创建它们。

标签: c multithreading initialization posix semaphore


【解决方案1】:

可以检查文件是否已经被 access() 函数创建

似乎只能这样检查。实际上这是行不通的。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    • 2016-04-29
    • 1970-01-01
    • 2013-06-04
    • 2011-12-06
    • 2016-05-09
    相关资源
    最近更新 更多