簡體   English   中英

使用pthread喚醒多線程的最佳方法

[英]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 (在主線程)。

為避免這種情況,我必須添加許多其他代碼來確保waitbroadcast的調用順序,這也不明智。

那么,是否有一種簡單的方法可以“排隊”所有線程(使它們開始同時運行)?

似乎有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM