提问人:Enlico 提问时间:1/26/2023 更新时间:1/26/2023 访问量:33
依靠与 const& 参数绑定的参数的 const-ness 是线程不安全的秘诀吗?
Is relying on the const-ness of arguments bind to const& parameters a recipe for thread un-safety?
问:
我刚刚看到了这样的代码
/* whatever */ foo(std::string const& s) {
// stuff
auto L = s.length();
int i{/* init based on L */};
while (i < L) {
// do other stuff and maybe
++i;
}
}
我建议人们可以避免定义和写作,而不是 和 .L
/* init based on s.length() */
(i < s.length())
/* init based on L */
(i < L)
但是谁真正告诉我,这不会因为与参数对应的参数被另一个并发线程更改而不可预测地改变?s.length()
s
答:
3赞
Sam Varshavchik
1/26/2023
#1
不,没人能告诉你。这是对对象含义的常见误解。const
对象不是承诺其他执行线程不能修改对象,而你却在做你的业务。const
对象是一个承诺,即访问该对象的代码不能修改它(无论“修改”对相关对象意味着什么)。const
const
事实上,根本不需要涉及其他执行线程。这个函数,在“东西”部分,可以调用一些其他函数,这些函数可以通过某处的某个指针或引用访问完全相同的对象,并完全改变它,然后返回到这个函数。foo
const
foo
评论
//do other stuff
s
s