我问这个问题是因为我发现的所有互斥体文档都处理单个函数,我认为我的情况很常见。
我的问题是,以下代码是否不仅会阻止func1()
OR func2()
并行执行多次,还会阻止func1()
AND func2()
同时执行?
#include <mutex>
std::mutex my_mutex;
void func1() {
my_mutex.lock();
// do something ...
my_mutex.unlock();
}
void func2() {
my_mutex.lock();
// do something ...
my_mutex.unlock();
}
Run Code Online (Sandbox Code Playgroud)
据我了解,许多人通常从 Stackoverflow 复制代码,在添加 @Al_Bundy 的输入后,我添加了示例代码的另一个版本 - 使用 lock_guard,它在函数结束时被破坏,从而确保在函数结束时释放互斥锁,并且守卫被摧毁。这是更安全、更好的做法,因为它在函数返回或退出的任何情况下都会释放互斥锁,即使它因异常而退出。
#include <mutex>
std::mutex my_mutex;
void func1() {
std::lock_guard<std::mutex> locker(my_mutex);
// do something ...
}
void func2() {
std::lock_guard<std::mutex> locker(my_mutex);
// do something ...
}
Run Code Online (Sandbox Code Playgroud)
您的两个函数都锁定同一个互斥体,因此最多可以同时执行其中一个函数。
互斥体根本不关心函数等。互斥体本身要么被锁定,要么被解锁。任何在互斥体已锁定时对其进行锁定的尝试都将被阻止,直到互斥体解锁为止。您正在使用一个互斥锁,因此一旦它被my_mutex.lock()
代码中的任何位置锁定,所有进一步的调用都将my_mutex.lock()
被阻止,直到my_mutex.unlock()
被调用。
一旦发生这种情况,调用内阻塞的线程之一将lock()
解除阻塞,获取(=锁定)互斥锁,然后继续。其他人将保持封锁状态。
归档时间: |
|
查看次数: |
3562 次 |
最近记录: |