我已经通过pthread_create
创建了4个线程。我希望它们同时开始运行,因此我在线程过程的最开始添加 sem_wait(&sem) 。在主线程中,我可能会使用类似的东西,但我认为这不是一个好的解决方案:
for (int i = 0; i < 4; i++)
{
sem_post(&sem);
}
我用谷歌搜索并找到了pthread_cond_t
。但是,pthread_cond_broadcast
只能唤醒当前正在等待的线程。即使我将 pthread_cond_wait
放在过程的最开始,仍然不能保证 pthread_cond_wait
在 pthread_cond_broadcast
之前调用(在主线程中) .
为了避免这种情况,我必须添加大量额外的代码来确保wait
和broadcast
的调用顺序,这也不太聪明。
那么,有没有一种简单的方法来“排列”所有线程(使它们同时开始运行)?
似乎有一个sem_post_multiple
,但它是pthread中的win32扩展。不过,我使用的是 Linux (Android)。
最佳答案
您正在寻找障碍
pthread_barrier_t
使用线程数 (n) 对其进行初始化,然后对每个线程调用 pthread_barrier_wait()。此调用将阻塞执行,直到 n 个线程到达屏障。
示例:
int num_threads = 4;
pthread_barrier_t bar;
void* thread_start(void* arg) {
pthread_barrier_wait(&bar);
//...
}
int main() {
pthread_barrier_init(&bar,NULL,num_threads);
pthread_t thread[num_threads];
for (int i=0; i < num_threads; i++) {
pthread_create(thread + i, NULL, &thread_start, NULL);
}
for (int i=0; i < num_threads; i++) {
pthread_join(thread[i], NULL);
}
pthread_barrier_destroy(&bar);
return 0;
}
关于c++ - 使用 pthread 唤醒多线程的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40126442/