私はこの質問をする前にずっと探していたので、私の問題を解決する方法を見つけることができません。 私は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. 私はマルチスレッドの初心者です。何か問題がある場合は、私の質問を編集するのはいい人です。
このタイプのシミュレーションは、スレッドを使用しない方が簡単です。スレッドを使用する特別な理由はありますか?毎回ループ(デルタタイム)に進む標準的な(シングルスレッドの)ゲーム・ループの更新は、このタスクに近づく私の方法です。 –
はい私は知っていますが、私の仕事はスレッド、mutexと条件変数を使う方法を学ぶために私に与えられました。私はスレッドなしでそれを作る方法を知っています。 –
なぜスレッドプールを使用していないのですか? –