C++ 使用pthread唤醒多线程的最佳方法
我通过C++ 使用pthread唤醒多线程的最佳方法,c++,multithreading,pthreads,C++,Multithreading,Pthreads,我通过pthread\u create创建了4个线程。我希望它们同时开始运行,因此我在线程过程的最开始添加sem\u wait(&sem)。在主线程中,我可能会使用类似的方法,但我认为这不是一个好的解决方案: for (int i = 0; i < 4; i++) { sem_post(&sem); } for(int i=0;i
pthread\u create
创建了4个线程。我希望它们同时开始运行,因此我在线程过程的最开始添加sem\u wait(&sem)
。在主线程中,我可能会使用类似的方法,但我认为这不是一个好的解决方案:
for (int i = 0; i < 4; i++)
{
sem_post(&sem);
}
for(int i=0;i<4;i++)
{
sem_post(和sem);
}
我在谷歌上搜索并找到了pthread\u cond\t
。但是,pthread\u cond\u broadcast
只能唤醒当前正在等待的线程。即使我将pthread\u cond\u wait
放在过程的最开始,仍然不能保证pthread\u cond\u wait
在pthread\u cond\u广播之前被调用(在主线程中)
为了避免这种情况,我必须添加大量额外的代码,以确保wait
和broadcast
的调用顺序,这也是不明智的
那么,有没有一种简单的方法来“排列”所有线程(使它们同时开始运行)
似乎有一个sem\u post\u multiple
,但它是pthread中的win32扩展。但是,我正在使用Linux(Android)。您正在搜索障碍
pthread\u barrier\t
使用线程数(n)初始化它,然后对每个线程调用pthread\u barrier\u 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;
}
int num_threads=4;
pthread_barrier_t bar;
void*线程开始(void*arg){
pthread_barrier_wait(&bar);
//...
}
int main(){
pthread_barrier_init(&bar,NULL,num_threads);
pthread_t thread[num_threads];
对于(inti=0;i
谢谢。这正是我想要的。Android NDK不支持pthread\u barrier\t,但可以根据这个简化版本来实现它:大多数同步结构可以使用其他工具构建,基本上您只需要互斥和cond.-变量