我有一些代码可以对图像执行特征检测。特征检测算法具有一些用户定义的参数。我正在研究一些代码来扫描不同的参数选择以查看它如何影响输出,我想使用多个线程以便扫描点可以并行运行。所以我有一个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
为什么要在线程中保留其中一个而不是另一个?