【问题标题】:boost thread lock errorboost线程锁错误
【发布时间】:2012-07-23 07:07:23
【问题描述】:

我有这个给出错误的代码:

 error this boost::lock_error
 error this boost::lock_error
 error this boost::lock_error
 error this boost::lock_error
 error this boost::lock_error

由于我不知道错误在哪里,我将尝试复制代码:

主要

  boost::tuple<ppa::Node*, ppa::Node*, ppa::Node*, bool>  tuple = dups.back();
  ppa::Node *n = boost::get<0>(tuple);
  cout << "creating other threads" << endl;
  for ( int i = 0; i < 5; ++i )
  {
    cout << "making  thread " << i << endl;
    g.create_thread( boost::bind( threaded_function, boost::ref(mf), 
                                    boost::ref(n) ));
  }

线程

  void threaded_function(Model_factory &mf, ppa::Node *root)
  {
    try 
    {   
      while(true)
      {
        boost::mutex::scoped_lock lock(result_mutex);

        if(wait.empty())
        {
          lock.unlock();
          break;
        }
        else 
        {
          lock.lock();
          if(!running_jobs.empty())
          {
            cout << "vector wait size = " << wait.size()   << "\n";
            cout << "running size   = " << running_jobs.size() << "\n";
            cout << "done size  = " << done.size()   << "\n";
            boost::tuple<ppa::Node*, ppa::Node*, ppa::Node*, bool> tuple;
            tuple = running_jobs.back();
            running_jobs.pop_back();
            ...
          }
          ...
        }
        ...
      }
    }
    catch (boost::lock_error& le)
    {
      cout << "error this " << le.what() << endl;
    }
  }

该代码用于我尝试并行执行的对齐程序中,它在不同的线程中一一对齐元组,直到等待列表(向量等待)为空。谢谢。 我做了一些事情,我在每个 if 和 else 之前放了一个 lock.unlock(),现在它正在工作,但是为什么?

【问题讨论】:

    标签: c++ multithreading boost locking


    【解决方案1】:

    您正在锁定互斥锁两次。

    boost::mutex::scoped_lock lock(result_mutex);
    

    为您锁定互斥锁。超出范围也会解锁,不用自己解锁。

    所以下面几行是不必要的:

    lock.lock();
    lock.unlock();
    

    【讨论】:

    • 好的,但是 func 没有离开范围,它停留在那里,所以我在每个 if 和 else 之后添加了解锁,它有点工作,除了一些随机的段错误
    • 解锁是必要的,因为break语句会导致循环终止,锁会超出范围(自动解锁)。第二个锁也不是必需的,因为锁已经通过创建作用域锁来完成。也许您应该将作用域锁移动到其他地方或直接使用锁定/解锁来控制互斥锁(根本不使用作用域锁)
    • 哈,我明白了,应该怎么做,你能提供一些例子吗,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多