c++ - boost 线程锁错误

标签 c++ multithreading boost locking

我有这个错误的代码:

 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;
    }
  }

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

最佳答案

你锁定了互斥体两次。

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

为您锁定互斥量。当它超出范围时它也会解锁它,所以你不需要自己解锁它。

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

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

关于c++ - boost 线程锁错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11607872/

相关文章:

c++ - 如何将 result_of 与 const 重载成员函数一起使用

c++ - 标记为 std::memory_order_seq_cst 的单个原子操作是否会在各处触发顺序一致性?

c++ - 将自动类型变量初始化为零。这种类型安全吗?

c++ - 有没有办法在运行时识别变量的 const 修饰符?

c++ - 具有可变周期的 WaitableTimer

c++ - 用于枚举的 boost::bimap

c++ - lexical_cast int 到字符串

c++ - 如何重新初始化嵌入式 Python 解释器?

c++ - 为什么 std::mutex 比 CRITICAL_SECTION 慢两倍

java - JNI 线程创建