std::locale 导致 Helgrind 出错
std::locale causing errors with Helgrind
在使用 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线程安全
相关文章:
- 访问者访问变体并返回不同类型时出错
- 在Linux for Windows上编译C++代码时出错
- 读取文件的最后一行并输入到链接列表时出错
- 重载操作程序时出错>>用于类中的字符串 memebr
- 调用专用模板时出错"no matching function for call to [...]"
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- LINK 尝试使用 OpenSSL evp aes 256 c++ 时出错
- 在Google Kick start中提交时出错
- 在c++中访问int到类对象的映射时出错
- 分段错误当我试图运行程序时出错
- 使用dynamic_cast和构造函数时出错
- CHECK(调用)函数在Google Colab中出错
- 用pybind11包装C++抽象类时出错
- 为x86而非x64编译时出错
- 从R调用C++函数并对其进行集成时出错
- 这个函数哪里出错了
- C++ 创建包含链表和字符串的对象的链接列表时出错
- 为重写std::exception的库生成swig接口时出错
- 导入/导出变量时出错
- std::locale 导致 Helgrind 出错