【发布时间】:2012-07-09 16:25:29
【问题描述】:
我有一些带有一些额外功能的单例类,它们在单独的线程中运行。结构如下:
class Singleton
{
private:
boost::mutex mMutex;
std::vector<std::string> mMessages;
public:
void AddMessage(const std::string &msg)
{
mMutex.lock();
mMessages.push_back(msg);
mMutex.unlock();
}
void Sender()
{
while (true) {
mMutex.lock();
for (size_t i = 0; i < mMessages.size(); ++i)
{
// Do something with mMessages[i]
}
mMutex.unlock();
}
}
};
...
int main()
{
Singleton *handle;
handle = Singleton::instance();
boost::thread sender(boost::bind(&Singleton::Sender, handle));
... app cycle ...
}
有时它会因错误而失败:
在抛出
的实例后调用终止'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::lock_error> >'
what(): boost::lock_error
Aborted
可能是什么以及找出断言原因的最佳方法是什么?
【问题讨论】:
-
附带说明,您应该使用 boost::scoped_lock 之类的锁,而不仅仅是锁定互斥锁
-
如果 mMessages 为空,您的 Sender() 函数正在旋转而没有执行任何操作。你应该在这里使用一个条件变量来让线程阻塞,直到有事情要做。
-
@TorstenRobitzki 是的,线程正在休眠。我只是决定不在示例中显示这个
-
照 Nikko 说的做,否则如果你的代码抛出异常你就麻烦大了!
标签: c++ multithreading exception boost mutex