2011-06-02 164 views
3

我们使用的一次性初始化这样的并行线程:pthread_once_t变量是否需要互斥锁?

/* 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变量的状态,我们需要一个互斥量来保护呢?

回答

8

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

这是一个的保护被执行多次呼叫的once_var。它将按预期工作,只要你:

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

为什么你需要确保'once_var'不是自动的?只要它在整个可能的使用期内保持在范围内,它应该可以正常工作。 – 2011-06-02 12:46:07

+4

@R:因为这就是man page所说的:-)如果变量是自动的,它就是未定义的行为。它可能会工作,UB有时会这样做,但这并不是一个明智的决定,依赖于它,不仅仅是ISO C标准中的UB。我怀疑这是他们担心的超出范围的可能性,但我不确定。 – paxdiablo 2011-06-02 13:48:42

5

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

2

如果那样,这整个机制是完全无用的。无论您使用什么方法确保您只初始化该互斥锁,就可以轻松地执行任何操作,只需使用此这个机制即可完成一次。

相关问题