Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading Boost库和CreateThread win API_Multithreading_Winapi_Boost_Boost Thread_Createthread - Fatal编程技术网

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);
}