2012-06-08 49 views
0

我正在Linux上进行多线程C++ boost。boost :: mutex无法避免C++程序中的竞争条件?

即使我尝试使用锁,以下程序仍然存在竞态条件。

结果是8或9或5。它不应该发生。

#include <iostream> 
#include <boost/bind.hpp> 
#include <boost/threadpool.hpp> 
#include <boost/thread/mutex.hpp> 
#include <boost/thread.hpp> 

boost::mutex myMutex ; 
int g = 0 ; 

void f() 
{ 

    //myMutex.lock(); 
    { 
      boost::mutex::scoped_lock lock(myMutex); 
      ++g; 
    } 
    //myMutex.unlock(); 
    return ; 
} 
const int threadnum = 10; 
int main() 
{ 
    boost::threadpool::fifo_pool tp(threadnum); 
    for (int i = 0 ; i < threadnum ; ++i) 
      tp.schedule(boost::bind(f)); 
    std::cout << g << std::endl ; 
    return 0 ; 
} 

任何帮助将不胜感激。

谢谢!

+4

不应该等待线程停止吗? – mfontanini

+2

唯一可以防止竞争条件或死锁的是**正确的设计**。没有银弹。 –

+1

我还会补充说,在主返回之前,任务**确实已经完成了**:它是超出范围之前完成所有任务并且可以更改的默认关闭策略。只是他们没有完成...... std :: cout ...执行。 –

回答

7

完成:

明白,任务只安排 执行是非常重要的。计划立即返回,并且 没有任何关于何时执行任务的保证以及处理将采取多长时间的处理 。

您安排10个任务,然后立即打印出结果了多达通过到达线时执行

的std ::法院克< <的std :: ENDL;

所以,当你的互斥量确保线程每次增加一个g值时,你不会等待它们打印结果之前完成。 修改代码的一种方法是等待池中的所有任务完成:

boost::threadpool::fifo_pool tp(threadnum); 
for (int i = 0 ; i < threadnum ; ++i) 
     tp.schedule(boost::bind(f)); 
tp.wait(); //WAIT FOR TASKS TO EXECUTE 
std::cout << g << std::endl ; 
return 0 ; 
5

我不知道我在读这个权利,但它看起来像你安排了一堆东西,会增加g,然后在g的内容上调用cout。你的互斥锁可以防止计划中的特效相互踩踏,但最终没有任何事情会迫使cout等到它们全部完成。你需要某种读/写互斥体。