首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >延迟锁和“增强:锁”

延迟锁和“增强:锁”
EN

Stack Overflow用户
提问于 2013-10-31 02:10:39
回答 2查看 1.6K关注 0票数 0

我读到了lock_guard和unique_lock之间的区别,我发现unique_lock是lock_guard的增强版本。有了唯一的锁,锁就可以被推迟,我读了的文章,偶然发现了boost::lock。我想知道我怎样才能用这个方法。我尝试了以下几点:

代码语言:javascript
复制
boost::mutex mutx;
boost::unique_lock<boost::mutex> guard (mutx,boost::defer_lock);
boost::lock(guard); //too few arguments in function call.

如果有人能向我解释一下::lock做什么以及它是如何works.Thanks的,我将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-31 02:46:22

boost::lock的目的是锁定几个锁,确保不发生死锁。

考虑以下情况:

代码语言:javascript
复制
unique_lock<...> a, b;

// thread 1
a.lock();
b.lock();
...

// thread 2
b.lock();
a.lock();

现在,如果第一个线程锁定a锁,然后第二个线程锁定b锁,那么您就会遇到一个问题:两个锁都被锁定了,除非其中一个解除锁,否则线程不会执行任何操作,这是不可能的。这种情况称为死锁。

boost::lock通过在遇到锁定锁时解锁已锁定的所有锁来避免此问题。两个锁情况的实现可能如下所示:

代码语言:javascript
复制
template<class L1, class L2>
void lock(L1& l1, L2& l2) 
{
    while (1) {
        if (l1.try_lock()) {
            if (l2.try_lock()) {
                return;
            } else {
                l1.unlock();
            }
        } 
        // yield (execute another thread) here
    }
}
票数 0
EN

Stack Overflow用户

发布于 2013-10-31 02:25:47

你的意思是

代码语言:javascript
复制
mutex mutx
unique_lock<mutex> guard(mutx,defer_lock);
guard.lock();

一旦您有了一个lock_guardunique_lock,就不再直接处理互斥对象,而开始处理守护对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19697249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档