[英]Best way to wakeup multiple thread using pthread
我已經通過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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.