1

私はエラーを出しているこのコードを持っています:

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

このコードは、私が並行して行おうとしている整列プログラムで使用され、待機リスト (ベクトル待機) が空になるまで、異なるスレッドでタプルを 1 つずつ整列させます。ありがとう。私はlock.unlock()すべてのifとelseの前に何かを置き、現在は機能していますが、なぜですか??

4

1 に答える 1

2

ミューテックスを 2 回ロックしています。

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

ミューテックスをロックします。また、範囲外になるとロックが解除されるため、自分でロックを解除する必要はありません。

したがって、次の行は不要です。

lock.lock();
lock.unlock();
于 2012-07-23T07:53:23.293 に答える