使用lock_guard所采用的互斥锁可以导致UB吗?

以下代码段是否可以由于使用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();
}
eer05067 回答:使用lock_guard所采用的互斥锁可以导致UB吗?

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

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

本文链接:https://www.f2er.com/2362860.html

大家都在问