【问题标题】:What is the equivalent of boost::upgrade_to_unique_lock in STL?STL 中 boost::upgrade_to_unique_lock 的等价物是什么?
【发布时间】:2015-05-18 10:00:30
【问题描述】:

我正在尝试用 C++11 中的 STL 功能替换增强功能。 我的多线程应用程序中有一个写函数。

首先,函数验证数据。接下来,写入它。 有两种锁,如下所述:

class Data
{
    mutable boost::mutex mut;
    void Data::Write()
    {
        boost::upgrade_lock<boost::shared_mutex> ulock(mut);
        // ... Verification statements

        boost::upgrade_to_unique_lock<boost::shared_mutex> lock(ulock);
        // ... Writing statements
    }
};

我是增强功能的新手。您能否解释一下它的作用以及我如何使用 STL 功能实现该功能?

【问题讨论】:

    标签: c++ multithreading stl boost-thread


    【解决方案1】:

    C++11 根本不提供共享锁。 C++14 可以,但不允许将它们升级为独占锁;为此,您需要第二个互斥锁,例如:

    mutable std::shared_timed_mutex read_mutex;
    std::mutex write_mutex;
    
    void Write() {
        std::shared_lock read_lock(read_mutex);
        // ... Verification statements
    
        std::lock_guard write_lock(write_mutex);
        // ... Writing statements
    }
    

    您只需要注意在已经持有读锁的同时获取写锁,以避免死锁。如果您有一个可行的 Boost 解决方案,最好坚持使用它,直到标准库提供等效功能。

    【讨论】:

    • 继续使用 boost 对我来说不是一个选择。我必须删除它。我试图测试你的解决方案。但无法将 shared_timed_mutex 放入代码中。它仅在 C++14 中添加。我的是 C++ 11 :(
    • @Neo:如果你不能使用 C++14,你不能使用 Boost,那么你就不能使用共享锁(除非你忘记了 C++ 库并直接进入本机 API)。这三个限制之一将不得不取消。
    • 重新添加提升。 :-) 它混合得很好。
    • 我认为建议的解决方案并不等同。 reader_lock 可以被获取,而write_lock 被另一个线程持有,这在原始代码中不会发生。
    • 这是不正确的。不能保证写互斥锁中发生的事情会在读互斥锁中看到。所以基本上它与完全没有读锁的代码效果相同。这是数据竞赛
    【解决方案2】:

    在 C++ 线程中你会得到:

    #include <thread>
    #include <mutex>
    
    using namespace std;
    
    mutex mu;
    
    // lock_guard: acquire the mutex mu and lock it. when the lock_guard object goes out of scope, mutex is unlocked.
    lock_guard<mutex> lock(mu);
    
    // more flexible than the lock_guard
    // http://en.cppreference.com/w/cpp/thread/unique_lock
    unique_lock<mutex> ulock(mu);
    ulock.unlock();
    ulock.lock();
    

    【讨论】:

    • C++11 就是这种情况。但问题是关于 C++14 中引入的共享锁。
    • 感谢您的快速回复。但我认为std::lock_guard 可以代替boost::unique_lock。但在这种情况下,我正在寻找 upgrade_lock 和 upgrade_to_unique_lock 的替代品。我认为当他们意味着升级时,可以在等待关键部分时获得更多偏好(如果我错了,请纠正我)。 STL中有没有类似的概念?
    • @Neo:“升级”意味着将共享锁转换为排他锁。据我所知,标准库还不支持(从 C++14 开始)。如果您需要该功能,我想您现在必须坚持使用 Boost。
    • @MikeSeymour,对不起,我忘了提到我感兴趣的 C++ 版本!我的项目是 C++11。所以我更喜欢 C++11 中的解决方案
    猜你喜欢
    • 2020-11-17
    • 2011-05-09
    • 2014-11-22
    • 2012-04-07
    • 2014-05-08
    • 2014-06-12
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    相关资源
    最近更新 更多