我想使用共享的互斥锁,这样线程仅在向 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/