我如何传递boost :: shared_ptr作为指向Windows线程函数的指针? 假设以下代码:
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解决了我的问题。 检查我自己的答案在这个页面
当你必须从一个类的参数传递给一个静态函数/方法,你有什么是一个回调参数(通常在线程回调),我通常传递给回调。 这样你有一个简单的演员,你可以访问你的班级的所有成员。 实际上,回调是作为你班级的一员:
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
您应该使用reinterpret_cast
并注意在产卵期间至少保存一个shared_ptr。 否则你的对象将被销毁。 也就是说,由于你传递了一个指向shared_ptr的指针,你不会享受通常的指针保护,如果所有现有的shared_ptrs都被销毁了,那么当你的线程产生时,它将包含一个非法的指针。
我通过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(); ... }
实际上,侵入式引用计数工作正常的情况之一是这种情况。
如果你想传递boost::shared_ptr
你可以把它放入一个具有侵入引用计数的结构,并将其传入。
这是假设你不只是想传入一个原始的指针,并得到接收线程完成后删除它。