Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用锁保护所采用的互斥锁会导致UB吗?_C++_Multithreading_Mutex_Unique Lock_Lock Guard - Fatal编程技术网

C++ 使用锁保护所采用的互斥锁会导致UB吗?

C++ 使用锁保护所采用的互斥锁会导致UB吗?,c++,multithreading,mutex,unique-lock,lock-guard,C++,Multithreading,Mutex,Unique Lock,Lock Guard,以下代码段是否会由于使用了lock\u-guard已采用的互斥锁而导致未加密行为?如果在同一个代码段中使用unique\u lock而不是lock\u guard,是否安全?我知道有std::unique\u lock::lock/unlock() #包括 #包括 #包括 #包括 std::互斥m1; 无效函数(整数计数){ 锁紧保护装置lG{m1}; Std::CUT> P>这个特定的代码可能是安全的,但是我不认为它是好的样式。问题是如果有东西在 M1. unCube()/和 M1.CULL(

以下代码段是否会由于使用了
lock\u-guard
已采用的互斥锁而导致未加密行为?如果在同一个代码段中使用
unique\u lock
而不是
lock\u guard
,是否安全?我知道有
std::unique\u lock::lock/unlock()

#包括
#包括
#包括
#包括
std::互斥m1;
无效函数(整数计数){
锁紧保护装置lG{m1};

Std::CUT> P>这个特定的代码可能是安全的,但是我不认为它是好的样式。问题是如果有东西在<代码> M1. unCube()/<代码>和<代码> M1.CULL()之间抛出异常。
,则
锁\u保护
析构函数将再次解锁解锁的互斥锁,从而导致UB。因此,即使保证这些语句之间的所有内容都不会抛出,代码的读取器也必须仔细检查该代码,以确保没有UB

最好使用
unique\u lock
并在
unique\u lock
上进行解锁/锁定,而不是直接在
互斥锁上进行,以确保在特殊情况下正确解锁

#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();
}