【问题标题】:Boost mutexes and threads提升互斥锁和线程
【发布时间】: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


【解决方案1】:

可能是您没有创建了对象Singleton!所以也没有创建互斥锁。

试试:

int main()
{
   Singleton handle; //object, not pointer
   boost::thread sender(boost::bind(&Singleton::Sender, &handle));
   ...
}

【讨论】:

  • 哦,对不起。不,创建句柄后我初始化它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-28
  • 2011-03-09
  • 2013-01-31
  • 2018-10-06
  • 2013-08-09
  • 1970-01-01
相关资源
最近更新 更多