chm*_*ike 318 c++ multithreading mutual-exclusion c++11 stdmutex
我有两个用例.
答:我想将两个线程的访问同步到队列.
B.我想将两个线程的访问同步到队列并使用条件变量,因为其中一个线程将等待内容由另一个线程存储到队列中.
对于用例AI,请参阅代码示例std::lock_guard<>
.对于用例BI,请参阅使用的代码示例std::unique_lock<>
.
两者之间有什么区别,我应该在哪个用例中使用哪一个?
inf*_*inf 312
不同之处在于您可以锁定和解锁std::unique_lock
.std::lock_guard
将仅在施工时锁定一次并在销毁时解锁.
因此对于用例B,您肯定需要一个std::unique_lock
条件变量.在情况A中,它取决于您是否需要重新锁定防护装置.
std::unique_lock
还有其他功能允许它例如:构建时不立即锁定互斥锁,而是构建RAII包装器(见这里).
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
};
Run Code Online (Sandbox Code Playgroud)
为了澄清chmike一个问题,在默认情况下std::lock_guard
并std::unique_lock
是相同的.所以在上面的例子中,你可以替换std::lock_guard
为std::unique_lock
.但是,std::unique_lock
可能会有更多的开销.
请注意,这些天应该使用std::scoped_lock
而不是std::lock_guard
.
Seb*_*edl 108
lock_guard
并且unique_lock
几乎是一样的; lock_guard
是受限制的版本,界面有限.
A lock_guard
始终保持从其构造到破坏的锁定.A unique_lock
可以在没有立即锁定的情况下创建,可以在其存在的任何点解锁,并且可以将锁的所有权从一个实例转移到另一个实例.
所以你总是使用lock_guard
,除非你需要的能力unique_lock
.一个condition_variable
需要unique_lock
.
Com*_*sMS 45
lock_guard
除非您需要能够unlock
在不损坏的情况下手动使用互斥锁,否则请使用lock
.
特别是,condition_variable
在打电话给睡觉时解锁其互斥锁wait
.这就是为什么lock_guard
这里还不够.
在lock_guard
和之间存在某些共同点unique_lock
和某些差异.
但是在问题的上下文中,编译器不允许lock_guard
结合条件变量使用,因为当一个线程调用条件变量上的wait时,互斥锁会自动解锁并且当其他线程/线程通知时和当前线程调用(退出等待),重新获取锁.
这种现象违背了原则lock_guard
.lock_guard
只能构造一次并且只能被破坏一次.
因此lock_guard
不能与条件变量结合使用,但unique_lock
可以是(因为unique_lock
可以多次锁定和解锁).
归档时间: |
|
查看次数: |
128050 次 |
最近记录: |