【问题标题】:How can I pass boost::shared_ptr as a pointer to a Windows Thread function?如何将 boost::shared_ptr 作为指向 Windows 线程函数的指针传递?
【发布时间】:2011-02-24 08:20:34
【问题描述】:

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

【问题讨论】:

  • 你为什么不直接使用 Boost.Thread 呢?
  • 我有很多与windows线程一起工作的代码,目前我没有足够的时间将它们转换为boost.Thread,另外,我从未使用过boost.thread。
  • 您不需要全部转换。但是 Boost.Thread 是类型安全的,并且非常直观地处理了这个问题。

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


【解决方案1】:

当您必须将参数从类传递给静态函数/方法并且您拥有的是回调参数(通常在线程回调中)时,我通常将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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我通过 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();
           ...
      }
      

      【讨论】:

      • wPtr 是 test::start() 中的一个局部变量,不保证能解决问题,在 test::start() 结束时会失效,所以问题和之前一样除非你在 start() 退出之前等待你开始“拾取”参数的线程。
      【解决方案4】:

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

      如果你想传递boost::shared_ptr,你可以将它放入一个具有侵入式引用计数的结构中并传入。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-29
        • 1970-01-01
        • 2019-08-17
        • 2013-11-18
        • 1970-01-01
        • 2021-10-05
        • 2010-11-19
        • 1970-01-01
        相关资源
        最近更新 更多