1
我在查詢這個問題之前就搜索了很長時間,而且我找不到如何解決我的問題。 我有五個線程(工人),這個工人正在開採黃金,將黃金運送到先前的郵筒並將其卸載。一條線程如何讓條件變量而不是等待條件變量
而我的問題是,當工人正在挖掘黃金時,用戶可以輸入b來檢查是否有足夠的黃金,如果這是真的建立營房。
當工人正在採金時,有2秒鐘的睡眠,這就是爲什麼我使用pthread_cond_timedwait()
。 我有全局變量存儲營地號碼,地圖上的黃金和前衛poste中的黃金 這裏是僞代碼。
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);
}
我的努力使類似的消費者生產,但在我的任務,我需要做的,而不是等待其他線程的東西礦井(礦金)。
其他問題是我需要在這兩個函數中使用相同的互斥量嗎?
P.S. 我是多線程的新手,如果有什麼問題,編輯我的問題將會很好。
做這種類型的模擬更容易不使用線程;是否有你想使用線程的特定原因?一個標準的(單線程)遊戲循環每次都會更新循環(循環時間),這是我接近這個任務的方法。 –
是的,我知道,但我的任務是給我學習如何使用線程,互斥和條件變量。我知道如何使它沒有線程。 –
爲什麼不使用線程池並完成它? –