簡體   English   中英

使用 lock_guard 采用的互斥鎖可以導致 UB 嗎?

[英]Can using the lock of a mutex, adopted by a lock_guard, lead to a 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();
}

這個特定的代碼可能是安全的,但我認為它不是很好的風格。 問題是,如果在m1.unlock()m1.lock()之間拋出異常,那么lock_guard析構函數將再次解鎖未鎖定的互斥鎖,從而導致 UB。 因此,即使保證這些語句之間的所有內容都不會拋出,代碼的讀者也必須非常仔細地檢查該代碼以確保沒有 UB。

最好使用unique_lockunique_lock上進行解鎖/鎖定舞蹈,而不是直接在mutex鎖上,以確保在特殊情況下正確解鎖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM