假设有NUM_TREADS
个帖子,他们必须在job1()
之前完成job2()
。如何保证这种情况发生,如下:
void thread_func(void *arg)
{
while(1) {
job1();
some_kind_of_waiting();
job2();
}
return NULL;
}
信号量会跟随工作还是有其他/更好的解决方案?
{
static int done;
static sem_t semaphore;
if(__sync_fetch_and_add(&done, 1) == THREAD_NUMS-1) {
done = 0;
for(i = 0; i < THREAD_NUMS-1; i++)
sem_post(&semaphore);
} else
sem_wait(&semaphore);
}
感谢。
答案 0 :(得分:3)
这恰好是阻碍障碍的问题。使用NUM_THREADS
初始化屏障(在主函数中,在生成线程之前):
pthread_barrier_t barrier;
pthread_barrier_init(&barrier, NULL, NUM_THREADS);
并使用pthread_barrier_wait()
进行同步:
void *thread_func(void *arg)
{
while(1) {
job1();
pthread_barrier_wait(&barrier);
job2();
}
return NULL;
}
如果您还需要线程等待所有其他线程再次强制job2()
,然后才能再次job1()
启动,则可以在屏障上添加第二个等待:
void *thread_func(void *arg)
{
while(1) {
job1();
pthread_barrier_wait(&barrier);
job2();
pthread_barrier_wait(&barrier);
}
return NULL;
}
答案 1 :(得分:1)
您描述了一个通常由名称barrier调用的高级并发控制结构。 C ++标准库虽然已经proposed,但没有实现屏障,并且有望成为未来C ++标准库的一部分。
在标准库提供解决方案之前,您当然可以自己实现屏障(可以使用条件变量),使用platform specific threading API或wrapper library。