第四章 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);
}
}真正的线程池、缓存和队列还要处理所有权、停止信号和竞争条件,等有实际需求时再单独写。