pthread_once_t变量是否需要互斥锁?

Maj*_*imi 3 c mutex pthreads

我们对pthreads使用一次性初始化,如下所示:

/* define a statically initialized pthread_once_t variable */
pthread_once_t once_var = PTHREAD_ONCE_INIT;

/* we call pthread_once function in threads */
int pthread_once(pthread_once_t *once_control, void (*init)(void));
Run Code Online (Sandbox Code Playgroud)

当多个线程要改变pthread_once_t变量的状态时,我们是否需要一个互斥锁来保护它?

pax*_*blo 8

不,你不需要互斥锁.这个pthread_once调用(这里的链接)保证只执行一次,即使多个线程同时尝试它.

正是这样once_var才能保护呼叫不被执行多次.如果您符合以下条件,它将按预期工作:

  • 初始化once_varPTHREAD_ONCE_INIT; 和
  • 确保once_var不是自动存储持续时间(例如,在堆栈上); 和
  • 让所有线程使用相同的once_var变量.

  • @R:因为这就是手册页所说的:-)如果变量是自动的,那么它是未定义的行为.它_may_工作,UB有时会这样做,但这并不是一个明智的决定依赖它,不仅仅是ISO C标准中的UB.我怀疑它是否有可能超出他们担心的范围,但我不确定. (4认同)
  • 为什么你需要确保`once_var`不是自动的?它应该可以正常工作,只要它在整个可能的使用期间保持在范围内. (2认同)

Eva*_*van 5

pthread_once是线程安全的.在这种情况下,您可以将pthread_once_t变量视为互斥锁.