我有两个用例。
答:我想同步两个线程对队列的访问。
B. 我想同步两个线程对队列的访问并使用条件变量,因为其中一个线程将等待另一个线程将内容存储到队列中。
对于用例 A,我看到代码示例使用std::lock_guard<>。对于用例 B,我看到代码示例使用std::unique_lock<>.
两者之间有什么区别?在哪种用例中我应该使用哪一种?
区别在于您可以锁定和解锁std::unique_lock
. std::lock_guard
只会在建造时锁定一次,并在破坏时解锁。
所以对于用例 B 你肯定需要一个std::unique_lock
为条件变量。对于情况 A,这取决于您是否需要重新锁定防护装置。
std::unique_lock
具有其他功能,允许它例如:在不立即锁定互斥体的情况下构建,但构建 RAII 包装器(请参阅here).
std::lock_guard
还提供了方便的 RAII 包装器,但无法安全地锁定多个互斥体。当您需要有限范围的包装器时可以使用它,例如:成员函数:
class MyClass{
std::mutex my_mutex;
void member_foo() {
std::lock_guard<mutex_type> lock(this->my_mutex);
/*
block of code which needs mutual exclusion (e.g. open the same
file in multiple threads).
*/
//mutex is automatically released when lock goes out of scope
}
};
默认情况下通过 chmike 澄清问题std::lock_guard
and std::unique_lock
是相同的。
所以在上面的情况下,你可以替换std::lock_guard
with std::unique_lock
。然而,std::unique_lock
可能会有更多的开销。
请注意,现在(自 C++17 起)人们应该使用std::scoped_lock代替std::lock_guard
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)