STL 中 boost::upgrade_to_unique_lock 的等价物是啥?

Posted

技术标签:

【中文标题】STL 中 boost::upgrade_to_unique_lock 的等价物是啥?【英文标题】: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 功能实现该功能?

【问题讨论】:

【参考方案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 中的解决方案

以上是关于STL 中 boost::upgrade_to_unique_lock 的等价物是啥?的主要内容,如果未能解决你的问题,请参考以下文章

(C++基础_STL) —— 初识STL

(C++基础_STL) —— 初识STL

如何在 STL 映射中迭代 STL 映射?

STL 中使用的 Comp 比较器是不是需要从不更改 STL 中的比较对象?

STL概述

STL源码剖析之组件