0

所以基本上我所處的情況是我有一堆線程,每個線程在整個一週進行不同的計算。在本週結束時,每個線程調用函數X(),然後開始計算下一週並重復此循環。多線程但只允許使用一個方法

但是,只有一個線程才允許實際執行方法X()中的操作,並且只有當所有線程都已達到方法X()時才執行操作。而且,沒有任何線程可以繼續前進,直到完成使用方法X()的一個線程。

所以我很難實現這一點。我覺得我需要使用一個條件變量,但我仍然不知道線程和什麼。

+0

可能有幾種方式來處理它,但它聽起來像一個信號量,主要是。 –

+0

聽起來像兩個問題:首先你需要等待所有線程準備好調用X() - 聽起來像是一個線程連接。其次,你需要所有的線程調用X(),但一次只允許一個 - 信號量或簡單的互斥量可以被使用(或者真的,一旦所有線程在第一步之後加入 - 你可以迭代線程和調用X()。) – MaximR

+0

創建一個互斥鎖並讓所有線程嘗試獲取一個鎖。然後,在函數X()中檢查一個像「alreadyRan == false」這樣的標誌。如果它爲假,請將其設置爲true。這樣每個線程都會調用X(),但只有第一個到達那裏的人會對它做任何有意義的事情。 – DigitalGhost

回答

1

Barriers這裏是一種有用的同步方法。

在pthread中,您可以使用兩個障礙,每個障礙都被初始化爲一個需求,然而許多線程正在運行。第一個在完成計算後同步線程,第二個在其中一個之後調用X()。方便的是,pthread_barrier_wait將選舉一個等待的線程實際調用X()只有你的N中的一個:

void *my_thread(void *whatever) { // XXX error checking omitted 
    while (1) { 
    int rc; 

    do_intense_calculations(); 

    // Wait for all calculations to finish 
    rc = pthread_barrier_wait(&calc_barrier); 

    // Am I nominated to run X() ? 
    if (rc == PTHREAD_BARRIER_SERIAL_THREAD) X(); 

    // Wait for everyone, including whoever is doing X() 
    rc = pthread_barrier_wait(&x_barrier); 
} 

Java的CyclicBarrier有一個Runnable論點將讓你做,但一個障礙同樣的事情。 (Runnable在所有派對到達之後但任何發佈之前都會運行。)

相關問題