我正在尝试创建一个boost线程,我看到线程已创建,但控件没有进入线程函数。有人可以解释一下为什么会这样吗?
请参阅下面的代码。
header_file.h
class fa {
public:
fa();
~fa();
int init(void);
static void* clThreadMemFunc(void *arg) { return ((fa*)arg)->collectData((fa*)arg); }
void* collectData(fa *f );
private:
int m_data;
boost::thread *m_CollectDataThread;
};
`
TEST.CPP
int fa::init(void)
{
if (m_CollectDataThread== NULL)
{
printf("New Thread...\n");
try
{
m_CollectDataThread =
new boost::thread((boost::bind(&fanotify::clThreadMemFunc, this)));
}
catch (...){perror("Thread error ");}
printf("m_CollectDataThread: %p \n", m_CollectDataThread);
}
return 0;
}
void* fa::collectData(fa *f)
{
printf("In collectData\n");
int data = f->m_data;
printf("data %d",data);
}
test.cpp
被编译/构建为库(test.so
),另一个主函数调用init
函数。我看到变量m_collectDataThread
的值从null变为某个值(线程被创建),catch也没有得到任何异常。
但我没有看到collectData
中的任何陈述被打印出来。为什么线程无法访问它?
答案 0 :(得分:1)
也许尝试添加联接。
E.g。
try
{
m_CollectDataThread =
new boost::thread(boost::bind(&fanotify::clThreadMemFunc, this));
m_CollectDataThread->join();
}
答案 1 :(得分:0)
当你使用boost::thread
或std::thread
时,你不需要传递线程函数的旧方法(使用静态方法和转换void *
指针),你可以直接调用类方法:
class fa {
public:
fa();
~fa();
int init(void);
void collectData();
private:
int m_data;
boost::thread *m_CollectDataThread;
};
m_CollectDataThread = new boost::thread( &fa::collectData, this );
// or explicitly using bind
m_CollectDataThread = new boost::thread( boost::bind( &fa::collectData, this ) );
boost是C ++库,而不是C