notify_all 导致分段错误
Posted
技术标签:
【中文标题】notify_all 导致分段错误【英文标题】:notify_all causes segmentation fault 【发布时间】:2013-04-23 13:45:59 【问题描述】:我正在使用 boost 线程,在析构函数中调用 notify_all() 时,我看到了分段错误。这是堆栈:
(gdb) where
#0 0x00007ffff752de84 in pthread_mutex_lock ()
from /lib/x86_64-linux-gnu/libpthread.so.0
#1 0x00007fffe85ab22e in boost::pthread::pthread_mutex_scoped_lock::pthread_mutex_scoped_lock (this=0x7fffffffdba0, m_=0x0)
at /usr/include/boost/thread/pthread/pthread_mutex_scoped_lock.hpp:26
#2 0x00007fffe85abb5d in boost::condition_variable::notify_one (this=0x0)
at /usr/include/boost/thread/pthread/condition_variable.hpp:88
#3 0x00007fffe8690864 in CampaignFrequency::stopFlushThread (this=0x6ad590)
at /home/git/gitRTB/infinityplus/src/common/shm/CampaignFrequency.cpp:197
#4 0x00007fffe868ffd7 in CampaignFrequency::~CampaignFrequency (
this=0x6ad590, __in_chrg=<optimised out>)
at /home/git/gitRTB/infinityplus/src/common/shm/CampaignFrequency.cpp:81
#5 0x00007fffe85bdc37 in rtb_child_init (s=0x7ffff7fc3238)
at /home/git/gitRTB/infinityplus/src/bidder/mod_rtb.cpp:265
#6 0x000000000044784c in ap_run_child_init ()
#7 0x000000000042817c in ?? ()
#8 0x0000000000463594 in ?? ()
#9 0x00000000004635f4 in ?? ()
#10 0x00000000004643fd in ?? ()
#11 0x000000000042f026 in ap_run_mpm ()
#12 0x0000000000428d74 in main ()
【问题讨论】:
【参考方案1】:没有实际看到代码,这主要是猜测。
从您的调试中:
#2 0x00007fffe85abb5d in boost::condition_variable::notify_one (this=0x0)
at /usr/include/boost/thread/pthread/condition_variable.hpp:88
意思是这个(在条件变量中)是nullptr
。看来您正在调用cv->notify_all()
,其中 cv 是nullptr
(又名0
)。您是否有可能在尝试使用条件变量之前将其删除?
【讨论】:
您的意思是说nullptr
或0x0
而不是NULL
,对吧? :)
@Vlad:你说错了。已编辑。
这是麻烦的部分,我不会在任何地方删除这个变量,m_flushCond = std::unique_ptr<:condition_variable>(new boost::condition_variable());
@godzilla:嗯,可以重置或移动 unique_ptr,两者都将其值重置为 nullptr。我会先弄清楚什么时候发生。
这只发生在我调用析构函数时,似乎调用析构函数时无法创建互斥锁。我会研究为什么会这样以上是关于notify_all 导致分段错误的主要内容,如果未能解决你的问题,请参考以下文章