CppCoreGuidelines CP.31 在线程间传递少量数据的时候,用值传递,不要用引用或指针
01 July 2023
“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 万个字符,复制两次就不太好了。