我不知道,CreateThread()
但看起来像是用于创建线程的 C 风格接口:您可能无法通过函数对象。最有可能的是,开始函数类型是道德等价的
extern "C" typedef void (*entry_funciont)(void*);
可能带有一些额外的参数并返回不同于void
. 你需要一个转发函数来恢复你的函数对象,你需要知道CreateThread()
作为“用户数据”传递给函数的函数对象的确切类型(我猜你NULL
在函数对象之后传递的位置.你可以使用类似这样的东西:
struct entry_base {
virtual ~entry_base() {}
virtual void call() = 0;
};
template <typename Fun>
struct entry
: entry_base {
Fun fun;
entry(Fun fun): d_fun(fun) {}
void call() {
this->d_fun();
delete this;
}
};
template <typename Fun>
entry_base* make_entry(Fun fun) {
return new entry<Fun>(fun);
}
extern "C" void call_entry(void* entry) {
static_cast<entry_base*>(entry)->call();
}
...然后可以这样使用:
base* b = ...; // you can't use a local object here!
handle = CreateThread(NULL, 0,
LPTHREAD_START_ROUTINE(&call_entry),
make_entry(bind2nd(mem_fun_ref(&base::show), &b)),
NULL, &dword);
请注意,我对 的接口有所推测CreateThread()
,即用户数据指针很可能会进入不同的位置。但是,绑定到指向本地对象的指针几乎肯定不会起作用:该对象可能会在线程运行时超出范围,并且会删除对象运行的基础。