c++ 依赖于绑定到const& parameters的参数的常量性是否会导致线程不安全?

dced5bon  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(76)

我刚看到这样的代码

/* 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参数对应的参数被另一个并发线程更改而不可预测地更改呢?

slwdgvem

slwdgvem1#

不,没有人能告诉你,这是对const对象含义的一种常见误解。
一个const对象并不是一个承诺,当您处理自己的事务时,其他执行线程不能修改该对象。
const对象承诺访问const对象的代码不能修改该对象(无论“修改”对所讨论的对象意味着什么)。
实际上,根本不需要涉及其他执行线程,这个foo函数,在“填充”部分,可以调用其他一些函数,这些函数可以通过指针或引用访问完全相同的const对象,并彻底改变它的内部和外部,然后返回到这个foo函数。

相关问题