如何将boost :: shared_ptr作为指向Windows Thread函数的指针传递?

时间:2011-02-24 08:20:34

标签: c++ windows boost shared-ptr beginthreadex

如何将boost :: shared_ptr作为指向Windows Thread函数的指针传递? 假设以下代码:

test::start()
{
    ....
    _beginthreadex( NULL, 0, &test::threadRun, &shared_from_this(), 0, &threadID );

    ...
    ...
}

/*this is a static function*/
UINT __stdcall test::threadRun( LPVOID lpParam )
{ 
     shared_ptr<test> k = *static_cast< shared_ptr<test>* >(lpParam);
     ...
}

我认为这段代码不正确,您的想法是什么? 我怎么能这样做?

编辑:我通过boost :: weak_ptr解决了我的问题。在此page

中查看我自己的答案

4 个答案:

答案 0 :(得分:3)

当你必须将参数从类传递给静态函数/方法时,你所拥有的是一个回调参数(通常在线程回调中),我通常会将this传递给回调。这样您就可以进行一次简单的演员表,并且可以访问班级的所有成员。实际上,回调是您班级的成员:

test::start()
{
    // [...]
    _beginthreadex(NULL, 0, &test::threadRun, this, 0, &threadID);
    // [...]
}

// this is a static function
UINT __stdcall test::threadRun(LPVOID lpParam)
{ 
     test* self = static_cast<test*>(lpParam);

     // do whatever you want with all the instance members :)

     self->getMyShared();
     self->useMyGreatMemberMethof();

     // ...
}

MY2C

答案 1 :(得分:1)

您应该使用reinterpret_cast并注意在产卵期间至少持有一个shared_ptr。否则你的对象将被销毁。也就是说,由于您将指针传递给shared_ptr,您将无法享受通常的指针保护,如果所有现有的shared_ptrs都被销毁,那么当您的线程产生时,它将包含非法指针。

答案 2 :(得分:1)

我通过boost :: weak_ptr解决了我的问题:

test::start()
{
    ....
    shared_ptr<test> shPtr = shared_from_this();
    boost::weak_ptr<test> wPtr=shPtr;
    _beginthreadex( NULL, 0, &test::threadRun, &wPtr, 0, &threadID );

    ...
    ...
}

/*this is a static function*/
UINT __stdcall test::threadRun( LPVOID lpParam )
{ 
shared_ptr<test> k      = static_cast< boost::weak_ptr<test>* >(lpParam)->lock();
     ...
}

答案 3 :(得分:0)

这是实际上侵入式引用计数运行良好的情况之一。

如果您想传递boost::shared_ptr,可以将其放入具有侵入性引用计数的结构中并将其传入。

这假设你不只是想传入一个原始指针,并在完成时让接收线程删除它。

相关问题