访问从另一个线程在一个线程中初始化的对象

时间:2018-03-22 09:19:34

标签: c++ multithreading boost boost-thread

我有一些代码可以对图像执行特征检测。特征检测算法具有一些用户定义的参数。我正在研究一些代码来扫描不同的参数选择以查看它如何影响输出,我想使用多个线程以便扫描点可以并行运行。所以我有一个Scanner类,其中包含以下数据成员和方法:

class Scanner
{
protected:
   int m_maxThreads,m_activeThreads;
   boost::thread_group m_threadpool;
   boost::mutex m_mtx;
   ImSeries* m_data;
   FileManager* m_fileManager;

public:
   Scanner();
   void run(some args);
   void run_point(some args);
}

其中ImSeries对象包含一系列表示为2D数组的图像,FileManager对象包含一组图像文件,并且有一个loadNext()方法,用于创建并返回一个新的ImSeries对象(在堆上)下一组文件。 run_point()方法应该使用作为参数传递的一组特定参数在m_data上运行特征检测,run()方法包含以下代码:

void Scanner::run(some args)
{
   //some stuff
   m_data = m_fileManager->loadNext();
   while(m_data){
      for(){ //several for loops here looping over parameter combinations
         while(m_activeThreads == m_maxThreads) boost::this_thread::sleep(boost::posix_time::millisec(60000));
         m_mtx.lock();
         m_threadpool.create_thread(boost::bind(&Scanner::run_point,this,args));
         m_activeThreads++;
         m_mtx.unlock();
      }
      m_threadpool.join_all(); //finish parameter scan on this image series before loading the next one
      delete m_data;
      m_data = m_fileManager->loadNext();
   }
}

但是当我尝试运行它时,一旦run_point()尝试调用m_data的方法,我就会遇到seg错误。我在gdb中运行它并在主线程中打印m_data的值并启动第一个工作线程并获得此结果:

  

主线程:m_data = 0x8e9900

     

工作线程:m_data = 0x1

我不明白为什么m_data在工作线程中不一样。更令人困惑的是m_fileManager确实具有预期的行为:

  

主线程:m_fileManager = 0x8aa700

     

工作线程m_fileManager = 0x8aa700

为什么要在线程中保留其中一个而不是另一个?

0 个答案:

没有答案