C++:防止多个函数同时执行
C++: Preventing multiple functions from being executed at the same time
我问这个问题是因为我找到的所有 mutex 文档都处理单个函数,我认为我的情况很常见。
我的问题是下面的代码是否不仅会阻止 func1()
或 func2()
被并行执行多次,还会阻止 func1()
和 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();
}
据我所知,许多人通常从 Whosebug 复制代码,我添加了另一个版本的示例代码,在添加 @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 ...
}
是的,只要同一个互斥量被锁定,就无法从其他任何地方锁定它,直到它被解锁。
您的两个函数都锁定了同一个互斥量,因此在任何时候最多只能执行其中一个。
互斥锁根本不关心函数等。互斥量本身要么被锁定,要么被解锁。任何试图在它已经被锁定时锁定它的尝试都会被阻止,直到互斥体被解锁。您正在使用一个互斥锁,因此一旦它被代码中任何地方的任何 my_mutex.lock()
锁定,所有对 my_mutex.lock()
的进一步调用将被阻止,直到调用 my_mutex.unlock()
。
一旦发生这种情况,在 lock()
调用中阻塞的 一个 线程将解除阻塞,获取(= 锁定)互斥量,然后继续。其他人将保持封锁状态。
是的,在大多数情况下是这样。但要注意互斥体有一个 thead 所有者。
只要是同一个线程,lock() 就不会等待互斥量被释放。
我问这个问题是因为我找到的所有 mutex 文档都处理单个函数,我认为我的情况很常见。
我的问题是下面的代码是否不仅会阻止 func1()
或 func2()
被并行执行多次,还会阻止 func1()
和 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();
}
据我所知,许多人通常从 Whosebug 复制代码,我添加了另一个版本的示例代码,在添加 @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 ...
}
是的,只要同一个互斥量被锁定,就无法从其他任何地方锁定它,直到它被解锁。
您的两个函数都锁定了同一个互斥量,因此在任何时候最多只能执行其中一个。
互斥锁根本不关心函数等。互斥量本身要么被锁定,要么被解锁。任何试图在它已经被锁定时锁定它的尝试都会被阻止,直到互斥体被解锁。您正在使用一个互斥锁,因此一旦它被代码中任何地方的任何 my_mutex.lock()
锁定,所有对 my_mutex.lock()
的进一步调用将被阻止,直到调用 my_mutex.unlock()
。
一旦发生这种情况,在 lock()
调用中阻塞的 一个 线程将解除阻塞,获取(= 锁定)互斥量,然后继续。其他人将保持封锁状态。
是的,在大多数情况下是这样。但要注意互斥体有一个 thead 所有者。 只要是同一个线程,lock() 就不会等待互斥量被释放。