Valgrind:getter方法中包含rdlock的线程加载冲突
Valgrind: Conflicting load by thread in getter method which contains a rdlock
我有一个常见的带有rdlock和unlock的getter方法:
e_state get_state ( )
{
rdlock();
e_state state= m_e_state;
unlock();
return state;
}
具有写锁定和解锁功能的设置程序:
void set_state (e_state a_new_e_state)
{
wrlock();
m_e_state = a_new_e_state;
unlock();
}
rdlock()、wrlock()和unlock()方法如下:
bool rdlock ( ){return pthread_rwlock_rdlock (&m_rwlock) == 0;}
bool wrlock ( ){return pthread_rwlock_wrlock (&m_rwlock) == 0;}
bool unlock ( ){return pthread_rwlock_unlock (&m_rwlock) == 0;}
使用Valgrind,我得到了以下错误:
Conflicting load by thread 3 at 0x04328fa0 size 4
==16557== at 0x8068712: Sample_Namespace::get_state() (CClassManagerXY.h:94)
==16557== by 0x807FA9B: Sample_Namespace::xy_method(std::string const&, Sample_Namespace::IClassX&, int) (IClassY.cpp:773)
==16557== by 0x48CC8CA: Sources::SourceClassX::run() (SourceClassX.cpp:156)
==16557== by 0x8065BEF: run(void*) (CClassManagerXY.cpp:120)
==16557== by 0x402A31B: ??? (in /usr/lib/valgrind/vgpreload_drd-x86-linux.so)
==16557== by 0x4062B24: start_thread (in /lib/libpthread-2.11.2.so)
==16557== by 0x428446D: clone (in /lib/libc-2.11.2.so)
==16557== Address 0x4328fa0 is at offset 8 from 0x4328f98. Allocation context:
==16557== at 0x4029BD3: operator new(unsigned int) (in /usr/lib/valgrind/vgpreload_drd-x86-linux.so)
==16557== by 0x807E9FD: Sample_Namespace::loads(std::string const&, bool) (CClassY.cpp:460)
==16557== by 0x807EE9A: Sample_Namespace::load() (CClassY.cpp:542)
==16557== by 0x807D7D4: Sample_Namespace::init() (CClassY.cpp:171)
==16557== by 0x808D57C: main (main.cpp:203)
==16557== Other segment start (thread 2)
==16557== at 0x4284458: clone (in /lib/libc-2.11.2.so)
==16557== Other segment end (thread 2)
==16557== at 0x42925E6: __lll_unlock_wake_private (in /lib/libc-2.11.2.so)
==16557== by 0x41F45DD: _L_unlock_13308 (in /lib/libc-2.11.2.so)
==16557== by 0x41F4527: buffered_vfprintf (in /lib/libc-2.11.2.so)
==16557== by 0x41EF2FA: vfprintf (in /lib/libc-2.11.2.so)
==16557== by 0x41F9BAE: fprintf (in /lib/libc-2.11.2.so)
==16557== by 0x40395F7: Sample_Namespace::write_trace_record(int, unsigned int, char const*, int, char const*, char const*, ...) (CTrace.cpp:106)
==16557== by 0x8065C84: run_adapter(void*) (CClassManagerXY.cpp:124)
==16557== by 0x402A31B: ??? (in /usr/lib/valgrind/vgpreload_drd-x86-linux.so)
==16557== by 0x4062B24: start_thread (in /lib/libpthread-2.11.2.so)
==16557== by 0x428446D: clone (in /lib/libc-2.11.2.so)
我不知道为什么Data Race可以接近状态变量,我在那里管理了锁。我不太明白"地址在…偏移8处"这一行是什么意思。你有什么线索吗?问题出在哪里?
谢谢PlasmaHH!我发现还有一种方法使用变量。这是我的错误。然而,我不太明白,冲突负载真的很危险吗?不仅仅是冲突的商店?
相关文章:
- C++ 多线程原子加载/存储
- QWebEngine 5.7.1 离线导航加载缓存
- 查找使用并行线程加总数的所有组合
- 是否可以在跨内核线程迁移后强制重新加载 thread_local 变量?
- OpenGL 在与呈现线程不同的线程中创建和加载 VBO 信息
- 加载的 OpenGL 函数是特定于上下文还是特定于线程?(视窗)
- 如何在单独的线程上加载纹理到主内存并使用它在另一个线程上渲染
- C++线程进行后台加载
- Valgrind:在多线程程序中发现冲突的存储/加载
- COCOS2D-X:从另一个线程中加载精灵,任何模式
- STD ::线程访问从共享库加载的函数
- Qt:在另一个线程中预加载 qpixmap
- 线程加载图像的速度更快,直到它们在Studio中消失
- 从非主线程加载的VAO崩溃
- SDL2加载屏幕/线程
- 程序中的线程加互操作
- Valgrind:getter方法中包含rdlock的线程加载冲突
- c++ -为离线VS2013加载微软符号
- c++中的多线程:加载一个大文件并执行一个函数
- 为什么cocos2d-x使用来自服务器的多线程加载sprite是黑色的