加速condition_variable等待多个锁定
boost condition_variable wait for multiple locks
>我在习惯线程编程时遇到问题。我试图构建一个带有互斥锁和锁的构造。但是我需要提升::condition_variable::等待两个锁作为参数。但是两个锁没有等待功能。
有人给我提示吗,或者我的方法完全错误?
我的目标是
- 允许并发 add((,将所有内容写入缓冲区
- 工作线程运算符 ((((,存储缓冲值
- 和一个 search((,在搜索之前等待工作线程
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
函数可以帮助实现以下方面:
-
http://www.boost.org/doc/libs/1_56_0/doc/html/thread/synchronization.html#thread.synchronization.lock_functions.lock_multiple
以
未指定和不确定的顺序锁定作为参数提供的 Lockable 对象,以避免死锁。可以安全地从具有相同互斥锁(或其他可锁定对象(的多个线程以不同的顺序并发调用此函数,而不会有死锁的风险。如果提供的 Lockable 对象上的任何 lock(( 或 try_lock(( 操作引发异常,则该函数获取的任何锁都将在函数退出之前释放。
-
http://en.cppreference.com/w/cpp/thread/lock(适用于 C++11(
例
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);
}
这是未经测试的,但可能会在路上帮助你
您可以在wait
之前和之后lock
手动调用allBufferLock.unlock
。但请注意,多个互斥锁的嵌套锁很容易导致死锁,如果在其他地方它们也会被锁定。在获取另一个之前解锁一个会更安全,例如,如果可能的话,internalBufferLock
而不是allBufferLock
。
相关文章:
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 如何找到锁定Linux futex的C++行
- G锁定铸造到基础上会释放模拟行为
- 如何让LLDB在成功时退出,在失败时等待
- 如何检查线程是否锁定
- 如何在C++中找到active directory中禁用和锁定的窗口帐户
- 我应该在锁定TBitmap画布后解锁它吗
- 等待整个 omp 块完成,然后再调用第二个函数
- 提升 ASIO - io_service 不要等待连接到线程
- 如何在C++中实现带有packaged_task的异步等待循环?
- 虚假唤醒是否会解锁所有等待线程,甚至是不相关的线程?
- 如何等待窗口隐藏在Qt中?
- C++ 11 中的锁定是否保证访问数据的新鲜度?
- 在两个线程上读/写 64 位,无互斥/锁定/原子
- 为什么condition_variable在等待生产者-消费者的锁定?C++
- 为什么既有std :: condition_variaible的通知和等待功能,都需要锁定的静音
- 等待另一个进程锁定然后解锁 Win32 互斥锁
- 加速condition_variable等待多个锁定
- 为什么condition_variable没有等待函数,它不重新锁定互斥对象
- 导致c++ 11 std::互斥锁将被阻塞的线程锁定到被动等待状态