多线程程序有时有这样的需求:不管创建了多少线程,有些初始化动作只能发生一次。如果由主线程来创建新线程,很容易做到这一点,即在创建依赖于该初始化的线程之前进行初始化。不过,对于库函数而言,这样处理就不可行,因为调用者在初次调用库函数之前可能已经创建了这些线程。因此需要这样的库函数:无论首次任何线程调用,都会执行初始化动作。
库函数可以通过pthread_once()实现一次性初始化。
int pthread_once(pthread_once_t *once_control, void (*init_routine)(void));
once_control的状态如下
1-->如果once_control = 0,那么pthread_once从未执行过,调用init_routine函数会执行。
2-->如果once_control = 1,那么pthread_once会陷入永久等待中,导致init_routine函数无法执行,直到phtread_once已经执行过一次为止。
3-->如果once_control = 2,由于pthread_once已经执行过一次,从而pthread_once会立即返回。
另外,参数once_control必须是一指针,指向初始化PTHREAD_ONCE_INIT的静态变量。
阅读(269340) | 评论(0) | 转发(0) |