std::locale 导致 Helgrind 出错

std::locale causing errors with Helgrind

本文关键字:出错 Helgrind locale std 导致      更新时间:2023-10-16

在使用 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)

所以我想知道,这会是一个问题吗,如果是这样,我可以解决它吗?我知道如何用瓦尔格林德抑制错误,但我不确定我是否应该担心。

正如std::locale文档所说:

在内部,区域设置对象被实现为一个 指向数组(按 std::locale::id 索引)的引用计数指针 指向分面的引用计数指针:复制区域设置仅复制一个 指针并递增多个引用计数。为了维护 标准C++库线程安全保证(对不同 对象始终是线程安全的),区域设置引用计数和 每个分面引用计数都以线程安全的方式更新,类似 到std::shared_ptr .

所以我想说你可能没有太多可担心的,但另一方面,如果你在线程中分配(不仅仅是读取)带有引用计数(如shared_ptr)的指针,你最好使用锁来防止错误的重新分配。

这里有一个很好的解释:std::shared_ptr线程安全