2017-04-18 5 views
1

私はこの質問をする前にずっと探していたので、私の問題を解決する方法を見つけることができません。 私は5つの糸(労働者)を持っています、この労働者は金を鉱山していて、前衛に金を運んでそこに降ろします。どのスレッドが条件変数を待たずに何かを作る方法

私の問題は、労働者が金を鉱山しているときに、ユーザーが十分な金があることを確認するために入力することができ、これが真実であれば兵舎を建設することができるということです。

労働者が金鉱を掘っているときには2秒の睡眠があるので、私はpthread_cond_timedwait()を使用しています。 私は兵舎番号、地図上の金、アバントポストの金を保存しているグローバル変数を持っています ここに擬似コードがあります。

void makeBarrack(size_t data) { 
    timespec waitTime = { 2, 0 }; 
    pthread_mutex_lock(&check_mutex); 
    while (wantBarrack) { 
     pthread_cond_timedwait(&condp, &gold_mutex, &waitTime); 
    } 
    std::cout << "Worker" << data << "is making barrack" << std::endl; 
    wantBarrack = false; 
    pthread_mutex_lock(&unload_mutex); 
    avantPost -= 100; 
    pthread_mutex_unlock(&unload_mutex); 
    barracks++; 

    pthread_mutex_unlock(&check_mutex); 
} 

void *work(void *data, char input) { 

    size_t thread_num = (size_t) data; 
    pthread_mutex_lock(&gold_mutex); 
    timespec waitTime = { 2, 0 }; 
    if ((input == 'B' || input == 'b') && avantPost >= 100) { 
     wantBarrack = true; 
     input = 0; 
    } else if ((input == 'B' || input == 'b') && avantPoste < 100) { 
     std::cout << "There is " << avantPoste << " gold" << std::endl; 
    } 
    while (wantBarrack) { 
     pthread_cond_timedwait(&condp, &gold_mutex, &waitTime); 
    } 
    makeBarrack(data); 
} 

私は消費者のプロデューサーのような何かをしようとしたが、私の仕事で私が代わりに鉱山に他のスレッドを待っているの何か(鉱山金)を行う必要があります。

他の質問はこの2つの機能で同じミューテックスを使用する必要がありますか?

P.S. 私はマルチスレッドの初心者です。何か問題がある場合は、私の質問を編集するのはいい人です。

+0

このタイプのシミュレーションは、スレッドを使用しない方が簡単です。スレッドを使用する特別な理由はありますか?毎回ループ(デルタタイム)に進む標準的な(シングルスレッドの)ゲーム・ループの更新は、このタスクに近づく私の方法です。 –

+0

はい私は知っていますが、私の仕事はスレッド、mutexと条件変数を使う方法を学ぶために私に与えられました。私はスレッドなしでそれを作る方法を知っています。 –

+0

なぜスレッドプールを使用していないのですか? –

答えて

0

私はcvを単純なifで使うことができるということを知ったので、問題は3回ありました.cvを使用する主な理由は、他のスレッドをブロックせずにスレッドをブロックできることです。そして、条件が成立したことを通知する必要があり、私たちはスレッドをブロック解除(解放)し、必要な機能を作成する準備ができました。 pthread_cond_timedwait() 私は自分が望む時間にスレッドをブロックできるので、私はpthread_cond_timedwait()を使用しています。

関連する問題