boost :: shared_ptr的析构函数阻塞了唯一的线程

时间:2012-06-08 16:27:28

标签: c++ boost locking shared-ptr

我正在将一个C ++程序从FreeBSD移植到RHEL。当我测试我的程序时,我发现当调用boost :: shared_ptr :: ~shared_ptr()时进程将挂起。

我使用gdb附加挂起进程,堆栈跟踪是:

(gdb) bt
#0  0x00e01430 in __kernel_vsyscall ()
#1  0x00bd8d96 in __pause_nocancel () from /lib/libpthread.so.0
#2  0x00bd30b2 in __pthread_mutex_lock_full () from /lib/libpthread.so.0
#3  0x04a60a26 in pthread_mutex_lock () from /lib/libc.so.6
#4  0x08069b61 in boost::detail::lightweight_mutex::scoped_lock::scoped_lock(boost::detail::lightweight_mutex&) ()
#5  0x080699d3 in boost::detail::sp_counted_base::release() ()
#6  0x08069999 in boost::detail::shared_count::~shared_count() ()
#7  0x08069952 in boost::shared_ptr<SS::Conf::SSConfNode>::~shared_ptr() ()
#8  0x00124fde in SS::Conf::SSConfManager::createConfFile(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) () from /home/y/lib/libSS_conf.so.1
#9  0x00125e0c in SS::Conf::SSConfManager::createAllConfFiles() () from /home/y/lib/libSS_conf.so.1
#10 0x0012946b in SS::Conf::SSConfManager::initFromDisk(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) () from /home/y/lib/libSS_conf.so.1
#11 0x00129c3b in SS::Conf::SSConfManager::configure(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) () from /home/y/lib/libSS_conf.so.1
#12 0x00156d0c in SS::Init::configure() () from /home/y/lib/libSS_init.so.1
#13 0x0805ac63 in SS::Main::init() ()
#14 0x0807117e in main ()

我的流程只包含一个帖子:

(gdb) info thread
* 1 Thread 0xf77a8a40 (LWP 16724)  0x00c54430 in __kernel_vsyscall ()

当我在头文件中 undef BOOST_HAS_THREADS并重建程序时,一切顺利。

升级版本是1.32,我在RHEL4.8上使用gcc 3.4.6-11。

2 个答案:

答案 0 :(得分:3)

我不确定问题是什么,但这可能是1.32 documentation的相关部分:

  

shared_ptr使用Boost.Config来检测实现是否支持线程。如果您的程序是单线程的,但您的平台由Boost.Config自动检测为支持多个线程,#define BOOST_DISABLE_THREADS以消除线程安全开销。

因此,请考虑使用#define BOOST_DISABLE_THREADS而不是取消定义BOOST_HAS_THREADS

这是1.33 and beyond documentation

  

从Boost版本1.33.0开始,shared_ptr在以下平台上使用无锁实现:

     
      
  • x86或x86-64上的GNU GCC;
  •   
  • IA64上的GNU GCC;
  •   
  • PowerPC上的Metrowerks CodeWarrior;
  •   
  • PowerPC上的GNU GCC;
  •   
  • 窗。
  •   
     

如果您的程序是单线程的,并且没有链接到可能在其默认配置中使用shared_ptr的任何库,则可以在项目范围内#defineBOOST_SP_DISABLE_THREADS切换到普通的非原子引用计数更新。

     

(在某些(但不是全部)翻译单元中定义BOOST_SP_DISABLE_THREADS在技术上违反了单定义规则和未定义的行为。但是,实现尝试尽力满足使用非原子的请求这些翻译单元的更新。但不保证。)

     

您可以定义宏BOOST_SP_USE_PTHREADS以关闭无锁定平台的实现,并回退到基于pthread_mutex_t的通用代码。

答案 1 :(得分:0)

最后我找到了原因。 我的主程序使用boost 1.32构建,但我的.so文件之一使用boost 1.38构建。运行我的程序时有2个shared_ptr实现并导致此问题。使用boost 1.32重建我的so文件后,程序运行良好。