我正在将一个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。
答案 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的任何库,则可以在项目范围内
#define
宏BOOST_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文件后,程序运行良好。