boost :: thread在每次运行时产生不同的结果

时间:2012-04-21 18:27:07

标签: c++ threadpool boost-thread

我正在尝试使用boost :: thread来执行“n”类似的工作。当然,“n”通常可能过高,因此我想将同时运行的线程的数量限制为一些小数m(比如说8)。我写了类似下面的内容,我打开了11个文本文件,每次使用4个线程打开4个文件。

我有一个小类parallel(在调用run()方法时会打开一个输出文件并为其写一行,接受一个int变量。编译顺利进行,程序运行没有然而,结果并不像预期的那样。文件是创建的,但它们并不总是11个。有谁知道我犯的是什么错误?

这是parallel.hpp:

 #include <fstream>
 #include <iostream>

 #include <boost/thread.hpp>

 class parallel{
 public:
    int m_start;

    parallel()
    {  }

    // member function
    void run(int start=2);
};

parallel.cpp实现文件是

#include "parallel.hpp"

void parallel::run(int start){

    m_start = start;

    std::cout << "I am " << m_start << "! Thread # " 
          << boost::this_thread::get_id()
          << " work started!" << std::endl;

    std::string fname("test-");
    std::ostringstream buffer;
    buffer << m_start << ".txt";

    fname.append(buffer.str());

    std::fstream output;
    output.open(fname.c_str(), std::ios::out);

    output << "Hi, I am " << m_start << std::endl;

    output.close();

    std::cout << "Thread # " 
          << boost::this_thread::get_id()
          << " work finished!" << std::endl;
}

和main.cpp:

 #include <iostream>
 #include <fstream>
 #include <string>

 #include <boost/thread.hpp>
 #include <boost/shared_ptr.hpp>

 #include "parallel.hpp"

 int main(int argc, char* argv[]){

     std::cout << "main: startup!" << std::endl;
     std::cout << boost::thread::hardware_concurrency() << std::endl;

     parallel p;

     int populationSize(11), concurrency(3);

     // define concurrent thread group
     std::vector<boost::shared_ptr<boost::thread> > threads;

     // population one-by-one
     while(populationSize >= 0) {
         // concurrent threads
         for(int i = 0; i < concurrency; i++){
             // create a thread
             boost::shared_ptr<boost::thread>
             thread(new boost::thread(&parallel::run, &p, populationSize--));
             threads.push_back(thread);
         }    
         // run the threads
         for(int i =0; i < concurrency; i++)
             threads[i]->join();

         threads.clear();
     }

     return 0;
 }

1 个答案:

答案 0 :(得分:0)

您有一个parallel个对象,其中包含一个m_start成员变量,所有线程都可以访问而无需任何同步。

<强>更新

这种竞争条件似乎是设计问题的结果。目前还不清楚parallel类型的对象是什么意思。

  • 如果它意味着代表一个线程,那么应该为每个创建的线程分配一个对象。发布的程序有一个对象和许多线程。
  • 如果它意味着代表一组线程,那么它不应该保留属于各个线程的数据。