2012-07-23 92 views
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; 
    } 
    } 

Ť他将代码用于我试图做的并行对齐程序,它将元组逐一对齐到不同的线程,直到等待列表(向量等待)为空。谢谢。 我已经做了一些事情,我把每个if和else之前的lock.unlock()和现在的工作,但为什么?

回答

2

您正在锁定互斥锁两次。

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

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

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

lock.lock(); 
lock.unlock(); 
+0

确定,但FUNC不离开的范围,它停留在那里,所以我加解锁每个if和else之后,它的排序工作,边一些随机分段错误 – 2012-07-23 07:58:12

+0

解锁是必要的,因为break语句将导致循环终止并且锁定超出范围(自动解锁)。第二个锁也是不必要的,因为锁已经通过创建范围锁来完成。也许你应该将范围锁移动到别的地方,或者直接用锁/解锁来控制互斥锁(根本不需要使用范围锁) – 2012-07-23 08:01:37

+0

下面我看看它应该怎么走,你能举一些例子,谢谢。 – 2012-07-23 08:05:24