我正試圖解決C++ 11中的生產者消費者問題。 我有一個保存資源的對象,多個線程可以添加或使用這些資源。我的問題是,當我嘗試在該對象上實現 a「當可用時使用」方法。 請假設插入/刪除操作的複雜性很小。如何在C++中正確解決生產者消費者問題11
對代碼邏輯的一點說明。
struct ResourceManager{
std::mutex mux;
std::unique_lock lock{mux};
std::condition_variable bell;
void addResource(/*some Resource*/){
lock.lock();
//add resource
lock.unlock();
bell.notify_one(); //notifies waiting consumer threads to consume
}
T getResource(){
while(true){
lock.lock();
if(/*resource is available*/){
//remove resource from the object
lock.unlock();
return resource;
}else{
//new unique lock mutex object wmux creation
lock.unlock(); //problem line
bell.wait(wmux); //waits until addResource rings the bell
continue;
}
}
}
};
假設以下情形:
- 兩個線程,T1,T2,幾乎同時調用addResource,的getResource。
-T2鎖定互斥鎖,並發現沒有更多可用資源,
因此它必須阻塞,直到有新資源可用。
因此它解鎖互斥鎖並設置等待的鐘。
-T1運行速度更快。當互斥鎖被解鎖時,
它立即添加資源,並且在T2設置等待響鈴之前,
T1已經響了,不通知任何人。
-T2無限期地等待鈴響,但沒有進一步的資源被添加。
我假設一個線程鎖定互斥鎖,可能是唯一一個解鎖它的 。因此,如果我在解鎖互斥鎖之前嘗試調用bell.wait,則互斥鎖永遠無法解鎖。
如果可能,我想不使用時間等待或多次檢查解決方案。
那麼我可以在C++ 11中解決這個問題?
可能與您的問題無關,但請使用'std :: unique_lock'等鎖定鎖來鎖定/解鎖互斥鎖。 –
鎖是一個unique_lock –
什麼是'wmux'?你應該鎖定'lock',並執行'bell.wait(lock)',以避免競爭狀態。 – erenon