我想使用共享的互斥锁,这样线程仅在向 vector / map /任何对象写入而不是从中读取时才被锁定。但是我认为func2()永远不会获得唯一性锁定,因为func1()永远不会解锁。尝试获取唯一性锁时,有什么方法不计入shared_mutex上的同线程锁?还是到那时问题仍然会发生?

我猜想我需要找到一种方法,一旦所有线程都达到func2()或释放了锁,就可以强制获取锁(一次一个线程)。

func2()
{
    boost::unique_lock<boost::shared_mutex> lock_access3(shared_mutex);
    /*stuff*/
    lock_access3.unlock();
}

func1()
{
    boost::shared_lock<boost::shared_mutex> lock_access1(shared_mutex);
    func2();
    lock_access1.unlock();
}

最佳答案

您需要做的两件事:

1)由于func1实现了写操作,因此它需要获取排他锁,而不是共享锁。

2)由于func2是在已持有锁的情况下调用的,因此不应尝试获取该锁。

关于c++ - 防止死锁共享助推互斥,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8950917/

10-12 21:43