【发布时间】:2020-09-25 19:13:46
【问题描述】:
假设我有一个获取锁并执行由参数传递的函数的函数:
template <typename T>
T acquireLock(std::mutex& _lock, const std::function<T()>& execution) {
try {
std::lock_guard<std::mutex> mutex (_lock);
return execution();
} catch (std::logic_error& error) {
std::cerr << "[exception caught]\n\t" << error.what() << std::endl;
}
return false;
}
另外,我有一个类需要为其某些方法获取所述锁。
class MyThreadSafeClass {
public:
bool Init();
bool StopApi();
unsigned int GetValue() {
auto ret = acquireLock<unsigned int>(_lock, [this]() -> unsigned int {
// does some work that's not thread-safe...
return value;
});
return ret;
}
private:
bool _ready = false;
std::mutex _lock;
};
我的疑问是,每当我调用GetValue() 时,查看我的acquireLock() 方法,execution() 调用是否也受到锁定范围的影响?
auto myClass = new MyThreadSafeClass();
myClass->GetValue();
查看this,更具体地说:
当一个 lock_guard 对象被创建时,它会尝试获取 它给出的互斥锁。当控制离开控制范围时 lock_guard 对象被创建,lock_guard 被破坏并且 互斥锁被释放。
我仍然不清楚execution() 代码内部发生的事情是否仍受锁定范围的影响。
【问题讨论】:
-
它是......它在lock_guard的范围内运行。它的范围是直到 return 被执行,并且直到
execute被执行后才会发生。 -
目前还不清楚你到底在问什么。首先构造
lock_guard,获取互斥锁。然后调用execution(),同时锁定互斥锁。当execution()退出时,lock_guard超出范围,释放互斥锁。 -
你的意思是,当函数
execution在被调用时试图获取同一个锁时会发生什么? -
不,@RemyLebeau 回答的正是我的意思!引用:“当 execution() 退出时, lock_guard 超出范围,释放互斥锁”。对不起,我现在明白了