我有一个关于线程安全和互斥量的问题。我有两个函数可能不会同时执行,因为这可能会导致问题:
std::mutex mutex;
void A() {
std::lock_guard<std::mutex> lock(mutex);
//do something (should't be done while function B is executing)
}
T B() {
std::lock_guard<std::mutex> lock(mutex);
//do something (should't be done while function A is executing)
return something;
}
现在的问题是,函数 A 和 B 不应该同时执行。这就是我使用互斥体的原因。但是,如果从多个线程同时调用函数 B 则完全没问题。然而,这也被互斥锁阻止了(我不想要这个)。那么,有没有办法既保证A和B不同时执行,又让函数B并行执行多次呢?
最佳答案
如果 C++14 是一个选项,您可以使用共享互斥锁(有时称为“读写器”互斥锁)。基本上,在函数 A()
中,您将获得一个唯一的(独占的,“writer”)锁,而在函数 B()
中,您将获得一个共享的(非独占的,“writer”)锁, "读者") 锁。
只要存在共享锁,其他线程就不能独占获取互斥量(但可以非独占地获取);只要独占锁存在,互斥量就不能被任何其他线程获取。
结果是您可以让多个线程同时执行函数 B()
,而函数 A()
的执行会阻止 A 的并发执行()
和 B()
由其他线程:
#include <shared_mutex>
std::shared_timed_mutex mutex;
void A() {
std::unique_lock<std::shared_timed_mutex> lock(mutex);
//do something (should't be done while function B is executing)
}
T B() {
std::shared_lock<std::shared_timed_mutex> lock(mutex);
//do something (should't be done while function A is executing)
return something;
}
请注意,即使是 B()
的并发执行,也会始终存在一些同步开销,这最终是否会给您带来比使用普通互斥锁更好的性能,这在很大程度上取决于发生了什么这些功能的内部和外部 - 在提交更复杂的解决方案之前始终进行测量。
Boost.Thread 还提供了 shared_mutex
的实现。
关于c++:为其他函数锁定互斥锁但本身可以并行执行的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30415320/