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

C 如何只初始化一次信号量?,c,multithreading,initialization,posix,semaphore,C,Multithreading,Initialization,Posix,Semaphore,我目前正在做的工作需要在一个函数中初始化两个posix信号量,该函数将运行多个进程,这些信号量将与另一个函数共享,这些函数也将运行这些进程。我该怎么做才能让一个线程只创建一次信号量,而其他线程只打开它们?我似乎在任何地方都找不到任何关于如何做到这一点的方法 关于这个主题,我所能找到的只是关于如何使用sem_wait()和sem_post()函数的内容,但没有任何特定于我的问题。我还必须确保一个文件只创建一次并由其他进程打开,但是可以检查该文件是否已经由access()函数创建。信号灯有类似的吗

我目前正在做的工作需要在一个函数中初始化两个posix信号量,该函数将运行多个进程,这些信号量将与另一个函数共享,这些函数也将运行这些进程。我该怎么做才能让一个线程只创建一次信号量,而其他线程只打开它们?我似乎在任何地方都找不到任何关于如何做到这一点的方法

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

如果您能帮助解释这是如何做到的,我们将不胜感激

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

看来只能这样检查。实际上,这是行不通的

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

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

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

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

看来只能这样检查。实际上,这是行不通的

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

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


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

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