C++11 std::shared_ptr работает нормально, но boost::shared_ptr дает сбой, что может вызвать это?

У меня есть многопоточная программа (не могу воспроизвести ее здесь - это тысячи строк), которая прекрасно работает с 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 имеет значение 0x3f9dafee19598306, который выглядит неправильно и не выровнен (последний, вероятно, является причиной сбоя).

Я никогда не видел проблем с версией C++ 11 (я тестировал ее как на Visual Studio 2013 в Windows, так и на текущем GCC в Linux), но это происходит каждый раз, когда я запускаю его на C++ 03 версия, так что я сомневаюсь, что это условие гонки в моем коде, иначе я бы уже видел это в версии C++ 11.

Так что я немного запутался - какая разница между boost::shared_ptr а также std::shared_ptr может быть причиной этого?


Обновить:

я использую make_shared а также... и кажется, что когда я избегаю использовать make_shared, бесконечные циклы версии C++ 11 в Linux тоже (все еще отлично работает в Windows). Не уверен, что это означает, хотя.

1 ответ

Решение

Я думаю, что нашел проблему.

Это было, на самом деле, не с boost::shared_ptr, но с boost::atomic в другом месте в моем коде.

boost::atomic автоматически не обнуляет его значение!

Другие вопросы по тегам