pthread_once_t变量是否需要互斥锁?

时间:2011-06-02 07:31:19

标签: c pthreads mutex

我们对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));

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

3 个答案:

答案 0 :(得分:8)

不,你不需要互斥锁。 pthread_once调用(link here)保证只执行一次,即使多个线程同时尝试它。

once_var保护呼叫不被执行多次。如果您:

,它将按预期工作
  • once_var初始化为PTHREAD_ONCE_INIT;和
  • 确保once_var不具有自动存储持续时间(例如,在堆栈上);和
  • 让所有主题使用相同的once_var变量。

答案 1 :(得分:5)

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

答案 2 :(得分:2)

如果确实如此,整个机制将毫无用处。无论你用什么来确保你只是初始化那个互斥锁就可以轻松地做任何事情你使用这个机制做一次。