20 June 2023

C++ 核心指南目录

“Minimize explicit sharing of writable data”

理由

如果你不共享可写数据,你就不会有数据竞争。你越少共享数据,越不容易忘记在数据访问进行同步。你越少共享数据,越不需要等待数据解锁。从而可以提升性能。

例子

bool validate(const vector<Reading>&);
Graph<Temp_node> temperature_gradients(const vector<Reading>&);
Image altitude_map(const vector<Reading>&);
// ...

void process_readings(const vector<Reading>& surface_readings)
{
    auto h1 = async([&] { if (!validate(surface_readings))
                throw Invalid_data{}; });
    auto h2 = async([&] { return temperature_gradients(surface_readings); });
    auto h3 = async([&] { return altitude_map(surface_readings); });
    // ...
    h1.get();
    auto v2 = h2.get();
    auto v3 = h3.get();
    // ...
}

如果没有这些 const, 我们就需要检查每一个异步调用的函数,是不是在使用 surface_readings 这个变量的时候存在数据竞争。一旦把 surface_readings 设置成 const, 我们就只要关心函数本身的逻辑是否正确,不用担心数据竞争了。

注意

我们可以安全高效地共享不可变数据。不需要锁机制。用常量的地方不存在数据竞争。