我有一个多线程程序(无法在这里重现它-成千上万行),每次都可以与C ++ 11(GCC 4.7.3)完美配合,但是在使用C ++ 03(带有Boost时会崩溃) 1.53)。
具体来说,我代std::atomic
和std::shared_ptr
同boost::atomic
和boost::shared_ptr
在我的代码(与编译它-std=c++03
在GCC)。否则代码是相同的。
但是,C ++ 03 / Boost版本会永远崩溃或循环。当它崩溃时,它在这里执行以下操作:
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff4dc2700 (LWP 4065)]
0x000000000043d0c8 in boost::detail::sp_counted_base::release() ()
对此的反汇编似乎是:
(gdb) disas 0x000000000043d0c8
Dump of assembler code for function _ZN5boost6detail15sp_counted_base7releaseEv:
0x000000000043d0b0 <+ 0>: mov QWORD PTR [rsp-0x8],rbp
0x000000000043d0b5 <+ 5>: mov ebp,0xffffffff
0x000000000043d0ba <+10>: mov QWORD PTR [rsp-0x10],rbx
0x000000000043d0bf <+15>: mov eax,ebp
0x000000000043d0c1 <+17>: sub rsp,0x18
0x000000000043d0c5 <+21>: mov rbx,rdi
=> 0x000000000043d0c8 <+24>: lock xadd DWORD PTR [rdi+0x8],eax
0x000000000043d0cd <+29>: cmp eax,0x1
0x000000000043d0d0 <+32>: je 0x43d0e8 <_ZN5boost6detail15sp_counted_base7releaseEv+56>
0x000000000043d0d2 <+34>: mov rbx,QWORD PTR [rsp+0x8]
0x000000000043d0d7 <+39>: mov rbp,QWORD PTR [rsp+0x10]
0x000000000043d0dc <+44>: add rsp,0x18
0x000000000043d0e0 <+48>: ret
我看到rdi
有value 0x3f9dafee19598306
,它看起来错了并且未对齐(后者可能是崩溃的原因)。
我从未在C ++ 11版本上看到任何问题(我已经在Windows的Visual Studio 2013和Linux的当前GCC上进行了测试),但是每次我在C ++ 03上运行它时,都会发生这种情况版本,所以我怀疑这是我代码中的争用条件,或者到目前为止,我是否会在C ++ 11版本中看到它。
所以我很困惑一点-有什么区别boost::shared_ptr
和std::shared_ptr
可能被造成的?
我make_shared
也在使用...,好像我避免使用时make_shared
,在Linux上也使用C ++ 11版本无限循环(在Windows上仍然可以正常工作)。虽然不确定这意味着什么。
我想我找到了问题。
实际上,它不是与boost::shared_ptr
,而是与boost::atomic
我代码中的其他地方。
boost::atomic
不会自动将其值清零!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句