我正试图解决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