bwe*_*ber 5 c++ parallel-processing multithreading mutex
我有一个关于线程安全和互斥锁的问题。我有两个可能无法同时执行的函数,因为这可能会导致问题:
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;
}
Run Code Online (Sandbox Code Playgroud)
现在的问题是,函数 A 和 B 不应该同时执行。这就是我使用互斥锁的原因。但是,如果从多个线程同时调用函数 B 是完全没问题的。但是,这也被互斥锁阻止了(我不想要这个)。现在,有没有办法确保 A 和 B 不会同时执行,同时仍然让函数 B 并行执行多次?
如果可以选择 C++14,则可以使用共享互斥体(有时称为“读写器”互斥体)。基本上,在函数内部,A()您将获得唯一(独占,“写入者”)锁,而在函数内部,B()您将获得共享(非独占,“读者”)锁。
只要共享锁存在,互斥锁就不能被其他线程独占地获取(但可以非独占地获取);只要存在独占锁,互斥锁就不能被任何其他线程获取。
结果是,您可以让多个线程同时执行 function B(),而 function 的执行会阻止两个线程以及其他线程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;
}
Run Code Online (Sandbox Code Playgroud)
请注意,即使是并发执行,也会始终存在一些同步开销B(),并且这最终是否会比使用普通互斥体提供更好的性能,这在很大程度上取决于这些函数内部和外部发生的情况 - 在提交更多内容之前始终进行测量复杂的解决方案。
Boost.Thread 还提供了shared_mutex.
| 归档时间: |
|
| 查看次数: |
1824 次 |
| 最近记录: |