2017-04-18 167 views
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. 我是多線程的新手,如果有什麼問題,編輯我的問題將會很好。

+0

做這種類型的模擬更容易不使用線程;是否有你想使用線程的特定原因?一個標準的(單線程)遊戲循環每次都會更新循環(循環時間),這是我接近這個任務的方法。 –

+0

是的,我知道,但我的任務是給我學習如何使用線程,互斥和條件變量。我知道如何使它沒有線程。 –

+0

爲什麼不使用線程池並完成它? –

回答

0

問題是我聽說我可以在簡單if中使用cv。使用cv的主要原因是我們可以在不阻塞其他線程的情況下阻塞我們的線程(它在等待cv時解鎖互斥量)。我們只需要表明條件已經完成,我們已經準備好解除(釋放)線程並創建我們想要的功能。我正在使用pthread_cond_timedwait() ,因爲我可以阻止我想要的時間。