Mutex模式,其中多个线程可以具有只读访问权限

时间:2015-07-06 09:13:36

标签: 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个呼叫,尽管它应该停止添加和删除呼叫,并等待那些完成。目前的行为是许多线程排队排队以便喂养恐龙,这使得系统陷入困境。

是否存在特定的(类似互斥体的)设计模式,允许这种需要只读访问的正常线程行为?

1 个答案:

答案 0 :(得分:4)

这是一个读写器互斥体; Boost和C ++使用更通用的术语&#34;共享互斥&#34;因为它可以用于多个读者单一作家以外的模式。

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

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