Joh*_*rry 3 c++ valgrind atomic spinlock
atomic_flag我尝试了在cplusplus.com上使用的基本示例。Valgrind 的 Helgrind 工具报告
164 errors from 28 contexts (suppressed: 0 from 0)
Run Code Online (Sandbox Code Playgroud)
举例如下
==4868== Possible data race during read of size 1 at 0x605220 by thread #3
==4868== Locks held: none
==4868== at 0x401172: test_and_set (atomic_base.h:176)
==4868== by 0x401172: append_number(int) (helgrind_spinlock.cpp:12)
[output deleted]
==4868== This conflicts with a previous write of size 1 by thread #2
==4868== Locks held: none
==4868== at 0x4011C9: clear (atomic_base.h:193)
==4868== by 0x4011C9: append_number(int) (helgrind_spinlock.cpp:14)
[output deleted]
Run Code Online (Sandbox Code Playgroud)
关于正确使用atomic_flag自旋锁的参考是否有误,或者 Helgrind 在这里给出了误报?
这些都是误报。Helgrind 不理解“低级”同步,它只理解 posix 同步原语。
请参阅用户手册http://www.valgrind.org/docs/manual/hg-manual.html#hg-manual . effective-use 其中例如说:
确保您的应用程序及其使用的所有库都使用 POSIX 线程原语。Helgrind 需要能够查看与线程创建、退出、锁定和其他同步事件相关的所有事件。为此,它会拦截许多 POSIX pthreads 函数。
不要从 Linux futex 系统调用、原子计数器等的组合中滚动你自己的线程原语(互斥体等)。这些会使 Helgrind 的内部正在发生的模型偏离轨道,并会给出虚假结果。
因此,等待 helgrind 理解例如 c++ 原子标志,您必须使用客户端请求注释代码,以使 helgrind “看到”基于原子标志的同步原语。
| 归档时间: |
|
| 查看次数: |
1331 次 |
| 最近记录: |