c++:为其他函数锁定互斥锁但本身可以并行执行的函数

标签 c++ multithreading parallel-processing 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;
}

现在的问题是,函数 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/

相关文章:

c++ - 无法迭代其元素包含 unique_ptr 的 map

c++ - 无法从 void 转换为 int

c++ - 将 int 转换为具有零填充(前导零)的 QString

multithreading - Maven Sonarqube 插件 : Multithreading

bash - 在脚本中执行 GNU Parallel

c++ - 使用STL c++使用绝对值对数字进行排序

使用 std::future 的 C++ 程序拒绝在 Windows XP Embedded 上运行

java - swingWorker调用的synchronized方法被中断?

java - 如何使用wait()和notifyAll()来一一运行线程?

haskell - 为什么我的 Haskell 程序使用 `par` 没有产生任何 Spark ?