gpt4 book ai didi

c++ - 对一个条件变量使用多个互斥量

转载 作者:行者123 更新时间:2023-11-30 00:58:00 25 4
gpt4 key购买 nike

是否有一种机制可以让一个条件变量使用多个互斥锁?我在 Linux 中,在 C++ 中使用 pthreads。

在一个应用程序中,我需要两个互斥量(而不是一个)由 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,一旦该线程没有任务要完成,它就会阻塞。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 中找到它们。

关于c++ - 对一个条件变量使用多个互斥量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7045576/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com