对一个条件变量使用多个互斥锁
Using more than one mutex with a conditional variable
是否有一种机制可以让条件变量使用多个互斥体?我在Linux和pthreads在c++。
在应用程序中,我需要由pthread_cond_wait()自动获取和释放两个互斥锁(而不是一个),但是该函数只接受一个。
我有一个名为BlockingManager的类,它有一个方法:
blockMeFor( pthread_cond_t* my_cond, pthread_mutex_t* my_lock, set<int> waitees);
,我正在使用它,假设它像pthread_cond_wait一样获取/释放互斥锁。
问题是,为了实现blockingManager,我也需要一个内部互斥锁,这两个互斥锁都应该自动获取和释放。
这里有一个相关的讨论,它说等待多个互斥会产生未定义的行为。http://sourceware.org/ml/libc-help/2011-04/msg00011.html
我所面临的问题的生产者/消费者模型如下:
我们有多个客户。每个客户端都有一些任务。每个任务可能有多个先决条件(在同一客户机或其他客户机的任务之间)。每个客户端都有一个消费者线程。任务从一个生产者线程分配给客户端。新分配的任务可能有资格在之前的任务之前完成。有时可能没有任务要做,但如果有任务要做,至少应该做一件。(应该是省力的)
我使用一个condvar每个消费者线程,它会阻塞一旦没有任务要做的线程。可由
发出信号生产者线程分配新任务。
另一个消费者线程正在完成一个任务。
我为每个消费者使用一个互斥锁来保护生产者之间的共享数据结构。消费者。和一个互斥锁(内部互斥锁)来保护多个消费者之间共享的数据结构。
在c++ 11中(如果您的编译器支持它),您可以使用std::lock
一次锁定两个互斥锁(没有死锁)。您可以使用它来构建引用两个互斥锁的Lock2
类。然后你可以用std::condition_variable_any
来等待Lock2
。这一切可能看起来像:
#include <mutex>
#include <condition_variable>
std::mutex m1;
std::mutex m2;
std::condition_variable_any cv;
class Lock2
{
std::mutex& m1_;
std::mutex& m2_;
public:
Lock2(std::mutex& m1, std::mutex& m2)
: m1_(m1), m2_(m2)
{
lock();
}
~Lock2() {unlock();}
Lock2(const Lock2&) = delete;
Lock2& operator=(const Lock2&) = delete;
void lock() {std::lock(m1_, m2_);}
void unlock() {m1_.unlock(); m2_.unlock();}
};
bool not_ready() {return false;}
void test()
{
Lock2 lk(m1, m2);
// m1 and m2 locked
while (not_ready())
cv.wait(lk); // m1 and m2 unlocked
// m1 and m2 locked
} // m1 and m2 unlocked
如果您的编译器还不支持这些工具,您可以在boost.
- 如何编写一个使用n倍三元条件语句的C++布尔函数
- 为什么我的最后一个 ELSE 条件无法正确执行
- 如何使用条件计算 3D 网格中从一个点到另一个点的所有路径
- 避免在条件更新时丢失唤醒是一个阻塞功能
- 计算另一个图像像素满足条件的像素值的平均值
- 如何使一个函数具有三种不同的输出条件?
- 我们可以在第一个else-if条件结束后使用另一个else-if条件吗
- 一个有效的图算法,满足以下条件
- 调用一个小函数两次(例如在if条件和主体中)比将结果存储在局部变量中更可取
- 是否可以为一个循环设置多个条件
- 在C++中,是否可以编写一个条件的lambda,即只是一个计算结果为真或假的条件
- 在未满足条件时的任何时刻结束一个段循环
- 为什么有条件编译运算符模板会更改另一个运算符的可用性?
- 如果前一个测试条件成功,则禁用测试条件
- 为什么在执行条件变量通知之前我们需要一个空的 std::lock_guard?
- 如何更改此空隙函数,以便在特殊条件下返回一个生成的字符串
- 您可以static_assert一个元组只有一种满足特定条件的类型
- 如何使用std ::有条件地选择一个免费功能
- 一个线程如何制作东西而不是在条件变量上等待
- 竞争条件:一个线程创建静态对象,另一个线程在初始化完成之前使用它.如何处理