我们对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
变量的状态时,我们是否需要一个互斥锁来保护它?
答案 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)
如果确实如此,整个机制将毫无用处。无论你用什么来确保你只是初始化那个互斥锁就可以轻松地做任何事情你使用这个机制做一次。