1

スレッドがブロードキャスト信号を受信する準備ができていることを確認する方法がありますか?私はメインのSleep(1)関数を置き換えたい。同期する別の方法がありますか

#include <iostream> 
#include <pthread.h> 

#define NUM 4 


using namespace std; 

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 
pthread_cond_t cond = PTHREAD_COND_INITIALIZER; 
pthread_t tid[NUM]; 


void *threads(void *arg){ 
    int tid = (int)arg; 
    while(true){ 
     pthread_mutex_lock(&mutex); 
     pthread_cond_wait(&cond,&mutex); 
     //do some work 
     cout<<"Thread: "<<tid<<endl;; 
     pthread_mutex_unlock(&mutex); 
    } 
} 

int main(){ 

    for(int i=0;i<NUM;i++){ 
     pthread_create(&tid[i],NULL,threads,(void*)i); 
    } 

    Sleep(1); 
    pthread_cond_broadcast(&cond); 

    Sleep(1); 
    pthread_cond_broadcast(&cond); 

    Sleep(1); 
    pthread_cond_broadcast(&cond); 

    return 0; 
} 

私はpthread_cond_waitの前にメモリバリアを試してみましたが、私はカウンターを使用するのではと思ったが、まだ何も私のために働いていません。

答えて

0

条件変数は、通常、述語に接続されます。他のスレッドでは、述語がすでに満たされているかどうかをチェックし(条件を保護しているmutexを保持している間にチェックする)、そうであれば、条件変数を待たない。 mainでは、mutexを取得し、mutexを保持しながら述語を変更します。その後、ミューテックスを解放し、コンデバーで信号またはブロードキャストを行います。ここでは類似した質問です: Synchronisation before pthread_cond_broadcast

はここにいくつかのコード例は次のとおりです。

#include <iostream> 
#include <pthread.h> 
#include <unistd.h> 

#include <cassert> 

#define NUM 4 
#define SIZE 256 


using std::cout; 

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 
pthread_cond_t cond = PTHREAD_COND_INITIALIZER; 
pthread_t tid[NUM]; 

int work_available; 

void *threads(void *arg) 
{ 
    int tid = *((int*)arg); 
    while (1) { 
     pthread_mutex_lock(&mutex); 
     while (work_available == 0) { 
      // While loop since cond_wait can have spurious wakeups.                                                                               
      pthread_cond_wait(&cond, &mutex); 
      cout << "Worker " << tid << " woke up...\n"; 
      cout << "Work available: " << work_available << '\n'; 
     } 
     if (work_available == -1) { 
      cout << "Worker " << tid << " quitting\n"; 
      pthread_mutex_unlock(&mutex); // Easy to forget, better to use C++11 RAII mutexes.                                                                        
      break; 
     } 
     assert(work_available > 0); 
     work_available--; 
     cout << "Worker " << tid << " took one item of work\n"; 
     pthread_mutex_unlock(&mutex); 

     //do some work                                                                                          
     sleep(2); // simulated work                                                                                       
     pthread_mutex_lock(&mutex); 
     cout << "Worker " << tid << " done with one item of work.\n"; 
     pthread_mutex_unlock(&mutex); 
    } 
} 


int main() 
{ 
    work_available = 0; 

    int args[NUM]; 
    for (int i=0; i<NUM; i++) { 
     args[i] = i; 
     pthread_create(&tid[i], NULL, threads, (void*)&args[i]); 
    } 

    const int MAX_TIME = 10; 
    for (int i = 0; i < MAX_TIME; i++) 
    { 
     pthread_mutex_lock(&mutex); 
     work_available++; 
     cout << "Main thread, work available: " << work_available << '\n'; 
     pthread_mutex_unlock(&mutex); 
     pthread_cond_broadcast(&cond); 
     sleep(1); 
    } 

    pthread_mutex_lock(&mutex); 
    cout << "Main signalling threads to quit\n"; 
    work_available = -1; 
    pthread_mutex_unlock(&mutex); 
    pthread_cond_broadcast(&cond); 

    for (int i = 0; i < NUM; i++) 
    { 
     pthread_join(tid[i], NULL); 

    } 
    return 0; 
} 
+0

私は何をしないのですか?変更されたコードを最初の投稿に追加しました –

+0

@TomNeumeier述語が* false *の場合に限り、ワーカースレッドはスリープ状態になります。述語を何回かトグルする必要はありません。スレッドがcondvar waitを超えて進んでも問題ない場合は、trueに設定するだけです。 –

+0

私はそれを試した、それdoesnt仕事 –

関連する問題