std :: locale导致Helgrind错误

时间:2018-12-21 22:21:49

标签: c++ locale valgrind

在使用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的错误,但是我不确定是否应该担心。

1 个答案:

答案 0 :(得分:1)

std::locale文档说:

  

在内部,将语言环境对象实现为-如果它是一个   指向数组的引用计数指针(由std::locale::id索引)   引用计数的指向方面的指针:复制语言环境仅复制一个   指针,并增加几个参考计数。保持   标准C ++库线程安全保证(在不同的操作上   对象始终是线程安全的),区域设置引用计数和   每个构面引用计数以线程安全的方式更新,类似   到std::shared_ptr

因此,我想您可能不必担心太多,但另一方面,如果您在线程中分配(不仅仅是读取)具有引用计数的指针(例如shared_ptr),则最好使用锁以防止错误的重新分配。

以下是一个很好的解释:std::shared_ptr thread safety