c++ - 多个线程可以具有只读访问权限的互斥模式

标签 c++ multithreading mutex

我有一个 Dinosaur 对象的列表,可以添加到这些对象,也可以从中删除它们,而且恐龙本身也需要喂食。这一切都发生在高度多线程的环境中,因此该列表受互斥锁保护。

static Mutex s_dinosaurMutex;
static vector<Dinosaur> s_dinosaurList;

void AddDinosaur(const Dinosaur& dinosaur)
{
    s_dinosaurMutex.Lock();
    s_dinosaurList.push_back(dinosaur);
    s_dinosaurMutex.Unlock();
}

void RemoveDinosaur(const Dinosaur& dinosaur)
{
    s_dinosaurMutex.Lock();

    vector<IMadderReceiver*>::iterator it = find(s_dinosaurList.begin(), s_dinosaurList.end(), dinosaur);
    if (it != s_dinosaurList.end())
        s_dinosaurList.erase(it);

    s_dinosaurMutex.Unlock();
}

void FeedDinosaur(const Dinosaur& dinosaur)
{
    s_dinosaurMutex.Lock();

    vector<IMadderReceiver*>::iterator it = find(s_dinosaurList.begin(), s_dinosaurList.end(), dinosaur);
    if (it != s_dinosaurList.end())
        (*it).Feed(); // Feeding a dinosaur can take a long time, ~ 1 second

    s_dinosaurMutex.Unlock();
}

现在问题出在喂食上。这可能需要很长时间,但如果多个线程同时喂食相同(或不同)的恐龙,那绝对没问题。因此,进食过程不应停止其他 FeedDinosaur 调用,但它应该停止 Add 和 Remove 调用,并等待它们完成。目前的行为是许多线程正在排队等待喂食恐龙,这使得系统陷入停顿。

是否有特定的(类似互斥锁的)设计模式允许这种需要只读访问权限的 ok-ing 线程的行为?

最佳答案

这是一个读写互斥锁; Boost 和 C++ 使用更通用的术语“共享互斥体”,因为它可用于除多个读取器-单个写入器之外的模式。

Boost.Thread 有 shared_mutex从版本 1.35.0 ( Reader/Writer Locks in C++ ) 开始。 C++ 有 shared_timed_mutex从 C++14 开始,将有 shared_mutex在 C++17 中;在此之前,您可以使用 C++14 shared_timed_mutex 而只是不使用超时机制。

在您的编写器线程中,为唯一 访问锁定共享互斥锁(使用unique_lock);在您的读者线程中,为共享 访问锁定共享互斥体(使用shared_lock)。

关于c++ - 多个线程可以具有只读访问权限的互斥模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31241900/

相关文章:

java - 如何获取同一应用程序中运行时单个线程的堆使用情况?

Java 多线程和 SWING

multithreading - 读写互斥锁/锁如何工作?

c - C 中 pthread 的问题

windows - 简单的多线程互斥示例是不正确的

c++ - 为什么构建 openBR 的命令不运行?

c++ - 未解析的外部符号 C++ 与汇编程序

c# - 线程问题

C++ 案例声明?

c++ - boost::allocate_unique 产生非默认可构造和不可移动可分配的 unique_ptrs