c++ - 如何使用 lock_guard 在 c++11 中实现 scoped_lock 功能

标签 c++ c++11

看起来像scoped_lock在 c++17 中提供了我所追求的功能,但是我目前与 c++11 相关联。

目前,当我们多次使用同一个互斥量调用 guard_lock 时,我发现它会出现死锁问题。 scoped_lock 是否防止多次调用(即重入?)? 在带有 lock_guard 的 c++11 中执行此操作是否有最佳实践?

mutex lockingMutex;

void get(string s)
{
    lock_guard<mutex> lock(lockingMutex);
    if (isPresent(s))
    {
        //....
    }
}

bool isPresent(string s)
{
    bool ret = false;
    lock_guard<mutex> lock(lockingMutex);
    //....
    return ret;
}

最佳答案

为了能够多次锁定同一个互斥锁,需要使用 std::recursive_mutex .递归互斥体比非递归互斥体更昂贵。

不过,最佳做法是以线程不会多次锁定同一个互斥量的方式设计代码。例如,您的公共(public)函数是否先锁定互斥锁,然后调用期望互斥锁已被锁定的实现函数。实现函数不得调用锁定互斥量的公共(public) API 函数。例如:

class A {
    std::mutex m_;
    int state_ = 0;

private: // These expect the mutex to have been locked.
    void foo_() {
        ++state_;
    }

    void bar_() {
        this->foo_();
    }

public: // Public functions lock the mutex first.
    void foo() {
        std::lock_guard<std::mutex> lock(m_);
        this->foo_();
    }

    void bar() {
        std::lock_guard<std::mutex> lock(m_);
        this->bar_();
    }
};

关于c++ - 如何使用 lock_guard 在 c++11 中实现 scoped_lock 功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52988631/

相关文章:

c++ - 如何判断未知类型数组的索引是否为空?

c++ - 使用另一个类的 unique_ptr 设置回调函数

c++ - 排序字符串 vector : plain C vs idiomatic C++11

c++ - 在 Codeblocks 中调试 2D vector

c++ - 常量元组 - 但能够更改内容(引用)?

c++ - 错误 411 需要长度 c++,libcurl PUT 请求

c++ - 如果已知访问顺序是安全的,如何在没有互斥锁的情况下同步线程/CPU?

c++ - ExTAPI : lineRegister returns before line is registered

C++虚函数

c++ - 为什么与花括号分隔的初始化程序一起使用的缩小转换不会导致错误?