我有下面的例子:死鎖模擬::互斥
template <typename T>
class container
{
public:
std::mutex _lock;
std::set<T> _elements;
void add(T element)
{
_elements.insert(element);
}
void remove(T element)
{
_elements.erase(element);
}
};
void exchange(container<int>& cont1, container<int>& cont2, int value)
{
cont1._lock.lock();
std::this_thread::sleep_for(std::chrono::seconds(1));
cont2._lock.lock();
cont1.remove(value);
cont2.add(value);
cont1._lock.unlock();
cont2._lock.unlock();
}
int main()
{
container<int> cont1, cont2;
cont1.add(1);
cont2.add(2);
std::thread t1(exchange, std::ref(cont1), std::ref(cont2), 1);
std::thread t2(exchange, std::ref(cont2), std::ref(cont1), 2);
t1.join();
t2.join();
return 0;
}
在這種情況下,我expiriencing死鎖。但是,當我使用std :: lock_guard而不是手動鎖定和解鎖互斥鎖時,我沒有任何死鎖。爲什麼?
void exchange(container<int>& cont1, container<int>& cont2, int value)
{
std::lock_guard<std::mutex>(cont1._lock);
std::this_thread::sleep_for(std::chrono::seconds(1));
std::lock_guard<std::mutex>(cont2._lock);
cont1.remove(value);
cont2.add(value);
}
這並不直接回答你的問題,但你可以通過使用['std :: lock'](http://en.cppreference.com/w/cpp/thread/lock)來鎖定這兩個死鎖互斥一次。你可以(也應該)在使用'std :: adopt_lock'之後,仍然可以將鎖的所有權轉移給'lock_guard'。 – ComicSansMS
@Amadeusz。你爲什麼改變論據?這是你陷入僵局的原因(或者你故意模擬它)。 –
@WernerErasmus:提示:看問題標題:-) –