gpt4 book ai didi

c++ - 手动解锁 lock_guard 是未定义的/错误的设计吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:06:14 26 4
gpt4 key购买 nike

我有这样的代码:

do {
lock_guard<mutex> lck(globalMtx);
auto itr = someMap.end();
for (/*conditions*/){
//do stuff with itr and someMap
// if a certain condition is met, we exit function with a return
// globalMtx needs to be unlocked at that time
}
if (itr == someMap.end()){
// I need to unlock the globalMtx here
globalMtx.unlock()
// A command is sent to modify someMap before we try again
this_thread::sleep_for( chrono::seconds( 5 ) );
} else {
break;
}
} while (true);

正如您在 if 作用域中看到的,我需要解锁 globalMtx,以便我可以在再次通过它之前修改“someMap”。我在许多线程/论坛/无论什么地方都读过,使用 mutex.lock()/unlock() 手动锁定互斥体是一个坏主意,通常再也不会用 c++11 或更高版本完成。

那么在这种情况下,我该怎么做才能根据需要控制互斥量,同时仍然防止离开作用域导致互斥量保持锁定的任何情况?

最佳答案

不,在这种情况下,您不应该直接调用 std::mutex::unlock(),因为 std::lock_guard 析构函数会调用 std: :mutex::unlock() 再次,这将导致 UB。您可以使用 std::unique_lock相反,它不像 std::lock_guard 那样轻量级,但允许您对其调用 unlock():

std::unique_lock<mutex> lck(globalMtx);
...
lck.unlock(); // lck object is aware that globalMtx is released and would do nothing in it's dtor after this

关于c++ - 手动解锁 lock_guard 是未定义的/错误的设计吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47704306/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com