Multithreading Boost库和CreateThread win API
我有一门课,比如:Multithreading Boost库和CreateThread win API,multithreading,winapi,boost,boost-thread,createthread,Multithreading,Winapi,Boost,Boost Thread,Createthread,我有一门课,比如: class MyStreamReader { public: MyStreamReader(MyPramameter myPram) {.....} ~MyStreamReader() {} DWORD WINAPI ReaderThread(LPVOID *lpdwThreadParam ) { //.... } }; 我想用WinAPI CreateThread调用ReaderThread但是CreateT
class MyStreamReader
{
public:
MyStreamReader(MyPramameter myPram) {.....}
~MyStreamReader() {}
DWORD WINAPI ReaderThread(LPVOID *lpdwThreadParam )
{
//....
}
};
我想用WinAPI CreateThread调用ReaderThread但是CreateThread需要reader线程函数需要静态函数。
在某些形式中,据说这在boost库中是可能的,例如:
CreateThread(NULL, 0, boost::bind(&MyStreamReader::ReaderThread,this),
(void*)&myParameterObject), 0, NULL);
但我得到了编译错误:
'CreateThread' : cannot convert parameter x from 'boost::_bi::bind_t<R,F,L>'
to 'LPTHREAD_START_ROUTINE'
或(无需绑定)
为了使用boost::thread,我将我的类定义更新为:
class MyStreamReader
{
public:
MyStreamReader(MyPramameter myPram) {.....}
~MyStreamReader() {}
void ReaderThread()
{
//....
}
};
一个常见的答案是使用静态“thunk”:
类工作者
{
公众:
静态DWORD Thunk(无效*pv)
{
工人*pThis=静态铸件(pv);
返回pThis->DoWork();
}
DWORD DoWork(){…}
};
...
int main()
{
工人;
CreateThread(NULL、0和Worker::Thunk和Worker);
}
当然,您可以在对pv的调用中添加更多参数。只要让你的恶作剧把它们正确地分类就行了
为了更直接地回答您的问题,boost::bind不能以这种方式与Winapi一起工作。我建议改为使用boost::thread,它可以与boost::bind一起使用(或者,如果您有C++0x编译器,请将std::thread与std::bind一起使用)。远离
CreateThread
,如果确实需要,请使用\u beginthread
。这些函数的级别太低,无法处理线程。只听“Kaz龙”。Sdtman为什么代码< <代码> >比<代码> > C++ >代码> >戴维:我有足够的东西要说,除非你有话要说。CreateThread
已在最新版本的运行时中修复。无论如何,这是一个可笑的限制。如果要在由其他模块创建的线程中运行代码,该怎么办?
boost::thread GetStreamsThread(&MyStreamReader::ReaderThread, streamReader);
class MyStreamReader
{
public:
MyStreamReader(MyPramameter myPram) {.....}
~MyStreamReader() {}
void ReaderThread()
{
//....
}
};
class Worker
{
public :
static DWORD Thunk(void *pv)
{
Worker *pThis = static_cast<Worker*>(pv);
return pThis->DoWork();
}
DWORD DoWork() { ... }
};
...
int main()
{
Worker worker;
CreateThread(NULL, 0, &Worker::Thunk, &worker);
}