我有一个使用 pthread 的 C 程序。
我希望新创建的线程在创建后立即运行。
这背后的原因是我的线程有初始化代码来设置信号处理程序,在我的主线程发送一些信号之前,我必须确保处理程序已经准备好。
我试过pthread_yield
在我之后做pthread_create
,但没有成功。
我怀疑这会有所不同,但我在 x86_64 上运行 Linux 3.6。
谢谢
我有一个使用 pthread 的 C 程序。
我希望新创建的线程在创建后立即运行。
这背后的原因是我的线程有初始化代码来设置信号处理程序,在我的主线程发送一些信号之前,我必须确保处理程序已经准备好。
我试过pthread_yield
在我之后做pthread_create
,但没有成功。
我怀疑这会有所不同,但我在 x86_64 上运行 Linux 3.6。
谢谢
如果您的目标是让主线程在继续前进之前等待所有线程到达同一点,我建议使用pthread_barrier_wait
:
void worker(void*);
int main(int argc, char **argv)
{
pthread_barrier_t b;
pthread_t children[TCOUNT];
int child;
/* +1 for our main thread */
pthread_barrier_init(&b, NULL, TCOUNT+1);
for (child = 0; child < TCOUNT; ++child)
{
pthread_create(&children[child], NULL, worker, &b);
}
printf("main: children created\n");
/* everybody who calls barrier_wait will wait
* until TCOUNT+1 have called it
*/
pthread_barrier_wait(&b);
printf("main: children finished\n");
/* wait for children to finish */
for (child = 0; child < TCOUNT; ++child)
{
pthread_join(&children[child], NULL);
}
/* clean-up */
pthread_barrier_destroy(&b);
return 0;
}
void worker(void *_b)
{
pthread_barrier_t *b = (pthread_barrier_t*)_b;
printf("child: before\n");
pthread_barrier_wait(b);
printf("child: after\n");
}
或者您可以使用屏障,即调用pthread_barrier_wait(在每个线程的例程早期,或在主线程初始化时),以确保每个相关线程都已到达屏障(之后您的一些线程可以发出您的顽皮信号技巧)。看到这个问题。