[英]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_lock
並在unique_lock
上進行解鎖/鎖定舞蹈,而不是直接在mutex
鎖上,以確保在特殊情況下正確解鎖。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.