手动解锁RAII包装器的关联互斥体(如st::unique_lock)总是UB吗
Is manually unlocking associated mutex of a RAII wrapper (like st::unique_lock) always a UB?
我想知道手动解锁与RAII包装器关联的互斥是否总是UB。例如,如果我们在RAII包装器像这样破坏之前再次锁定它,是否可以:
int i = 0;
std::mutex mx_;
void foo() {
for (int k = 0; k < 10000; k++) {
std::unique_lock<std::mutex> lk(mx_);
i++;
mx_.unlock();
mx_.lock();
i++;
}
}
我提出这个问题的原因是,我正试图编写一个小型RAII包装器,将std::shared_mutex
的共享锁升级为独占锁,我需要手动锁定/解锁与其他锁关联的std::shared_mutex
,我想知道它是否是UB。这是我的upgrade_lock
类:
template<typename Mutex>
class upgrade_lock {
public:
using mutex_type = Mutex;
explicit upgrade_lock(mutex_type& mx) : mxp_(&mx) {
mxp_->unlock_shared();
mxp_->lock();
}
~upgrade_lock() {
mxp_->unlock();
mxp_->lock_shared();
}
upgrade_lock(const upgrade_lock&) = delete;
upgrade_lock& operator=(const upgrade_lock&) = delete;
private:
mutex_type* mxp_ = nullptr;
};
我假设这个类只在线程获取共享锁时使用。关于为什么解锁/锁定对不由另一个互斥体保护,我认为这真的没有必要。我现在可以这样使用这个类:
int i = 0;
std::shared_mutex mx_;
void goo() {
for (int k = 0; k < 10000; k++) {
std::shared_lock<std::shared_mutex> lk(mx_);
if (i > 5000) {
upgrade_lock<std::shared_mutex> lk2(mx_);
i++;
}
}
}
如果配对正确,我不认为它是UB(@DanielLangr说,这将试图解锁一个已经解锁的互斥对象(
不过您可以直接传递锁。
template<typename lock_type>
class upgrade_lock {
public:
upgrade_lock(lock_type& src_lock):lock(&src_lock){
lock->unlock_shared();
lock->mutex()->lock();
}
~upgrade_lock() {
lock->mutex()->unlock();
lock->lock_shared();
}
upgrade_lock(const upgrade_lock&) = delete;
upgrade_lock& operator=(const upgrade_lock&) = delete;
private:
lock_type* lock;
};
(代码未测试(
相关文章:
- 为什么 std::unique 不调用 std::sort?
- 生成"unique"矩阵
- 我对 std::unique(算法)C++有问题
- 防止函数占用 const st::string& 接受 0
- std::shared_ptr::unique(),复制和线程安全
- 如何在C++03中用自定义谓词调用std::unique
- 如何使用set<pair<int,int> >::iterator itrator it迭代set<pair<int,int> >st中的值?
- C /FORTRAN项目由Visual Studio 2010/Intel 2013创建,将不会在Visual St
- C++ std::unique并没有显示我对它的期望
- C++14 unique_ptr并使用已删除的函数'std::unique-ptr' unique_ptr错误
- C++ 如何生成 10,000 个 UNIQUE 随机整数以存储在 BST 中?
- 通过Modbus TCP与CMMO-ST-C5-1-LKP Festo控制器进行Qt/C++通信
- C++:'unique vector'数据结构
- 为什么 [std::unique] 不能应用于 [std::multiset]?
- 使用 FFMPEG 将每个输入图像转换为 H264 编译时出错,该图像在 MevisLab 中运行的 Visual St
- 使用 std::unique 和 vector.erase 删除除最后一次出现的重复元素之外的所有元素
- java.lang.UnsatisfiedLinkError: 找不到本机方法: soundtouch.ST.setup
- 是否可以在 std::unique<T[ ]> 上应用 std::sort?
- 使用C++代码在Windows Phone 8.1中获取Unique DeviceId
- 为什么在代码段中从 char* 转换为 st::string 比从 const char* 更可取