5

如何将 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 解决了我的问题。在此页面中检查我自己的答案

4

4 回答 4

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

于 2011-02-24T08:46:59.627 回答
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();
     ...
}
于 2011-02-24T09:58:21.660 回答
1

您应该使用 areinterpret_cast并注意在生成过程中至少持有一个 shared_ptr。否则你的对象将被销毁。也就是说,由于您传递了一个指向 shared_ptr 的指针,因此您将无法享受通常的指针保护,并且如果您现有的所有 shared_ptr 都被销毁,那么当您的线程被生成时,它将包含一个非法指针。

于 2011-02-24T08:29:32.827 回答
0

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

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

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

于 2011-02-24T12:16:33.080 回答