c++ - 可以使用lock_guard采用的互斥锁的锁导致UB吗?

标签 c++ multithreading mutex unique-lock lock-guard

由于使用了 lock_guard 已经采用的互斥锁,以下代码段是否会导致未受污染的行为? ?如果我使用 unique_lock 会安全吗?而不是 lock_guard在同一个片段中?我知道有std::unique_lock<T>::lock/unlock()

#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>

std::mutex m1;
void func(int count ){

    std::lock_guard lG{m1};
    std::cout << std::this_thread::get_id() << std::endl;
    if(count == 1) {
        m1.unlock();
        std::this_thread::sleep_for(std::chrono::duration<size_t, std::ratio<1, 1>>{6});
        m1.lock();
    }
    std::cout << std::this_thread::get_id() << std::endl;
}
int main()
{
    std::thread t1 {func, 1};
    std::thread t2 {func, 9};
    t1.join();
    t2.join();
}

最佳答案

这个特定的代码可能是安全的,但我认为它不是很好的风格。问题是如果在 m1.unlock() 之间抛出异常和 m1.lock() ,然后是 lock_guard析构函数将再次解锁未锁定的互斥锁,从而导致 UB。因此,即使保证这些语句之间的所有内容都不会抛出,代码的阅读者也必须非常仔细地检查该代码以确保没有 UB。

使用 unique_lock 会好得多并在 unique_lock 上进行解锁/锁定舞蹈而不是直接上mutex以确保在特殊情况下正确解锁。

关于c++ - 可以使用lock_guard采用的互斥锁的锁导致UB吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61780201/

相关文章:

c++ - 如何确保在 C++ 中覆盖(隐藏)派生类中的方法?

c++ - 除法为负股息,但四舍五入为负无穷大?

c++ - enum 类型不能接受 cin 命令

python - 有什么办法可以杀死一个线程吗?

c++ - 将函数作为参数传递以简化线程创建

c++ - 我的代码 : error: expected primary-expression before ‘.’ token 出错

c++ - 如何在 Eclipse CDT 中使用 google test 管理测试输出?

c - C 中的多线程矩阵乘法

c++ - 删除 std::lock_guard 相对于其他堆栈分配对象的顺序/速度?

c++ - 共享互斥量是否比相对较大结构的原子更有效?