01 July 2023

C++ 核心指南目录

“Pass small amounts of data between threads by value, rather than by reference or pointer”

理由

少量数据值传递比共享成本低。因为共享需要某些锁机制。数据副本自然有各自的所有权,避免了可能存在的数据竞争。

注意

很难精确定义“少量数据”。

例子

string modify1(string);
void modify2(string&);

void fct(string& s)
{
    auto res = async(modify1, s);
    async(modify2, s);
}

modify1 会复制 2 个字符串值。 modify2 不会。从另一个角度看, modify1 的实现和单线程代码的实现没什么差别。但是 modify2 的实现就需要某些锁机制来防止数据竞争。如果字符串很短,少于 10 个字符,调用 modify1 速度很快。其实大部分的成本在于线程切换。如果字符串很长,超出 100 万个字符,复制两次就不太好了。