Skip to content

第四章 C++17并发相关库特性 v1.1 ​

原来的数据管道、缓存和性能对比示例没有完成线程安全和退出条件验证,先不把它们当作实践方案。后面有可复现程序再补。

第一部分 并行算法 ​

C++17 给部分标准算法增加了执行策略。能否真的并行、能快多少,取决于编译器和标准库实现,不能只看写了 std::execution::par 就认为一定会提速。

cpp
#include <execution>
#include <numeric>
#include <vector>

int main() {
    std::vector<int> values{1, 2, 3, 4, 5};
    int sum = std::reduce(
        std::execution::seq,
        values.begin(),
        values.end(),
        0
    );
    return sum == 15 ? 0 : 1;
}

这段先用 seq 保持结果可预测。需要尝试 par 时,应在当前工具链下分别测量并确认算法中的操作没有共享可变状态。

第二部分 锁 ​

std::shared_mutex 和 std::scoped_lock 在 C++17 可用。读多写少的情况可以用前者区分读锁和写锁;需要同时拿多个互斥量时,scoped_lock 比手写固定加锁顺序更稳妥。

cpp
#include <mutex>

int main() {
    std::mutex left;
    std::mutex right;

    {
        std::scoped_lock lock(left, right);
    }
}

真正的线程池、缓存和队列还要处理所有权、停止信号和竞争条件,等有实际需求时再单独写。