已经讨论了这个问题,但是我还没有确定的答案。这里有部分讨论:
https://www.justsoftwaresolutions.co.uk/cplusplus/const-and-thread-safety.html
但是我的答案仍然不清楚。
如果您定义std::string const kstrValue = "Value"
是kstrValue
本质上是线程安全的?
我的研究表明,只要您不调用会改变字符串的std库函数,它就是线程安全的。
这是真的吗?
答案 0 :(得分:2)
您不能调用任何修改该字符串的函数std ::或其他方式。文章的意思是将您的类写为std::string
(或假设的int
类)。
通过确保将不要修改类的方法标记为const
,您可以让const Foo
对象在线程之间自由共享,并且在知道可以没有数据争用,因为没有修改。
使用const Foo &
引用时,它会更微妙。您不知道基础对象确实是const
,还是const
已添加到引用中,并且在其他地方可能发生修改。仍然需要在线程之间同步访问此类对象。
答案 1 :(得分:1)
是的。
C ++标准库函数不得直接或间接修改可被当前线程以外的线程访问的对象([intro.multithread]),除非通过函数的非常量参数(包括该参数)直接或间接访问对象。 / p>