如何只初始化一次信号量?
How to initialize semaphore only once?
我目前正在做的事情需要在一个函数内初始化几个 posix 信号量,多个进程将是 运行,并且信号量将与另一个函数共享,其中这些进程也将是 运行。我该怎么做才能让信号量只由一个线程创建一次,而其他线程只打开它们?我似乎无法在任何地方找到有关如何执行此操作的任何信息。
关于这个主题,我能找到的只是关于如何使用 sem_wait() 和 sem_post() 函数的信息,但没有针对我的问题的具体信息。我还必须确保文件仅创建一次并由其他进程打开,但可以检查该文件是否已由 access() 函数创建。信号量有类似的东西吗?
如能帮助解释这是如何完成的,我们将不胜感激。
the file can be checked whether or not it's been created already by the access() function
看来只能这么查了。实际上这是行不通的。
在您通过调用 access()
确认文件不存在之后,在您尝试自己创建文件之前,可以创建另一个执行线程。这称为 竞争条件 。
这就是为什么在 open
和 sem_open
系统调用中使用 O_EXCL | O_CREAT
标志的原因。此操作是 atomic:它验证 file/semaphore 不存在,并在一个不可分割的操作中创建一个新的。如果操作 returns 失败并且 errno
设置为 EEXIST
,则 file/semaphore 已经存在。
这自然只适用于命名信号量(您使用 sem_open
创建的信号量)。应在启动使用它的线程之前创建未命名的信号量(您使用 sem_init
创建的信号量),或者应通过其他方式同步其创建。
我目前正在做的事情需要在一个函数内初始化几个 posix 信号量,多个进程将是 运行,并且信号量将与另一个函数共享,其中这些进程也将是 运行。我该怎么做才能让信号量只由一个线程创建一次,而其他线程只打开它们?我似乎无法在任何地方找到有关如何执行此操作的任何信息。
关于这个主题,我能找到的只是关于如何使用 sem_wait() 和 sem_post() 函数的信息,但没有针对我的问题的具体信息。我还必须确保文件仅创建一次并由其他进程打开,但可以检查该文件是否已由 access() 函数创建。信号量有类似的东西吗?
如能帮助解释这是如何完成的,我们将不胜感激。
the file can be checked whether or not it's been created already by the access() function
看来只能这么查了。实际上这是行不通的。
在您通过调用 access()
确认文件不存在之后,在您尝试自己创建文件之前,可以创建另一个执行线程。这称为 竞争条件 。
这就是为什么在 open
和 sem_open
系统调用中使用 O_EXCL | O_CREAT
标志的原因。此操作是 atomic:它验证 file/semaphore 不存在,并在一个不可分割的操作中创建一个新的。如果操作 returns 失败并且 errno
设置为 EEXIST
,则 file/semaphore 已经存在。
这自然只适用于命名信号量(您使用 sem_open
创建的信号量)。应在启动使用它的线程之前创建未命名的信号量(您使用 sem_init
创建的信号量),或者应通过其他方式同步其创建。