在使用Helgrind对程序进行性能分析时,我注意到我遇到了很多类似于以下内容的错误:
==8347== Possible data race during read of size 4 at 0x53C47A0 by thread #2
==8347== Locks held: none
==8347== at 0x50E4E68: std::locale::locale() (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==8347== by 0x515B1DE: std::__cxx11::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >::basic_stringstream(std::_Ios_Openmode) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
和
==8347== This conflicts with a previous write of size 4 by thread #1
==8347== Locks held: 1, at address 0xFFEFFF638
==8347== at 0x50E3115: std::locale::~locale() (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
所以我在想,这会是一个问题,如果可以的话,我可以解决这个问题吗?我知道如何抑制Valgrind的错误,但是我不确定是否应该担心。
答案 0 :(得分:1)
std::locale
文档说:
在内部,将语言环境对象实现为-如果它是一个 指向数组的引用计数指针(由
std::locale::id
索引) 引用计数的指向方面的指针:复制语言环境仅复制一个 指针,并增加几个参考计数。保持 标准C ++库线程安全保证(在不同的操作上 对象始终是线程安全的),区域设置引用计数和 每个构面引用计数以线程安全的方式更新,类似 到std::shared_ptr
。
因此,我想您可能不必担心太多,但另一方面,如果您在线程中分配(不仅仅是读取)具有引用计数的指针(例如shared_ptr
),则最好使用锁以防止错误的重新分配。
以下是一个很好的解释:std::shared_ptr thread safety