如何将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 中查看我自己的答案答案 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
,可以将其放入具有侵入性引用计数的结构中并将其传入。
这假设你不只是想传入一个原始指针,并在完成时让接收线程删除它。