簡體   English   中英

C - 如何在其中一個線程用條件變量向主線程發出信號后終止所有線程?

[英]C - How to terminate all threads after one of them signals the main thread with a condition variable?

在我的程序中,主線程啟動多個子線程,為計數器鎖定一個互斥鎖,然后休眠直到計數器達到 N。

在無限循環中,其他線程做一些工作,它們在每次迭代中交替增加計數器。 一旦計數器 == N,其中一個必須向主線程發出信號,並且所有子線程都必須結束。

我的問題是我不確定何時應該鎖定計數器互斥鎖並在線程函數中發出信號,因為一旦計數器變為 NI 設法喚醒主線程並退出一個子線程,但其他線程當他們都應該終止時,將繼續努力工作。

我的問題是,如何檢查 counter == N 是否僅通過其中一個線程發送信號,而其他線程僅在沒有任何信號的情況下返回? 這是否可以通過在每次迭代中只鎖定互斥鎖一次來完成,以便檢查其值 (== N)? 如果是,如何?

void *thread_function(void *arg) {
    int *id = (int *) arg;

    for (;;) {
        pthread_mutex_lock(&mutex_counter);
        counter++;
        if (counter == N) {
            pthread_cond_signal(&cond);
            pthread_mutex_unlock(&mutex_counter);
            return NULL;
        }
        if (counter > N) {
            pthread_mutex_unlock(&mutex_counter);
            return NULL;
        }
        pthread_mutex_unlock(&mutex_counter);
        
        sleep(random());
        // do some work here
        // ...
        // finish work
    }

上面代碼的問題在於,盡管所有線程都終止了,但它們執行的循環比所需的迭代次數少了一次,因為計數器在 if 子句之前增加了(因此計數器將為 N,但沒有完成 N 次工作循環)。

但是,如果我將計數器放在函數的末尾,線程將做比需要更多的工作,這會弄亂我的程序。

為什么在主線程中鎖定反互斥鎖? 為什么需要從其他踏板向主踏板發送信號? 如果您只有一個全局計數器並且所有線程都在增加它,那么您可以在主線程中啟動所有線程,記住它們的線程 ID,然后使用 while(counter<N); 等待。 操作說明。 畢竟,只需使用 pthread_cancel 殺死所有線程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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