我习惯于进行线程编程时遇到问题。我试图用互斥锁和锁构建一个构造。但是我需要使用两个锁作为参数的boost::condition_variable::wait。但是没有两个锁的等待功能。
有人给我个提示吗,还是我的方法完全错误?
我的目的是
class Archive
{
vector externalBuffer;
vector swapBuffer;
vector internalBuffer;
boost::mutex externalBufferMutex;
boost::mutex allBufferMutex;
boost::condition_variable bufferIsFilledConditionVariable;
void operator () ()
{
unique_lock allBufferLock(allBufferMutex);
while(true)
{
{
unique_lock lock(externalBufferMutex);
while(buffer.empty())
{
bufferIsFilledConditionVariable.wait(...); // I should call it with two locks?
}
externalBuffer.swap(swapBuffer);
}
{
internalBuffer.swap(swapBuffer);
// store values from internalBuffer
...
internalBuffer.clear();
}
}
}
void add(value) // pseudo code here
{
{
lock_guard lock(externalBufferMutex);
externalBuffer.push_back(value);
}
bufferIsFilledConditionVariable.notify_one();
}
// search will not be used concurrently with add()
// it should just wait for the worker thread
someReturnValue search()
{
unique_lock lock(allBufferMutex);
// search here
...
}
}
最佳答案
我不确定您要实现的目标,通常,应避免在多个重叠的锁下进行操作。
但是,通常也要避免死锁,您只需使用一致的锁顺序即可。非成员lock
函数可以帮助您:
例子
unique_lock lk_all(allBufferMutex, boost::defer_lock);
unique_lock lk_ext(externalBufferMutex, boost::defer_lock);
boost::lock(lk_all, lk_ext);
while(internalBuffer.empty())
{
lk_all.unlock();
bufferIsFilledConditionVariable.wait(lk_ext);
boost::lock(lk_all, lk_ext);
}
这未经测试,但可能会对您有所帮助
关于c++ - boost condition_variable等待多个锁,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26628401/