如何在C ++中删除在另一个线程中创建的对象

时间:2010-07-12 15:18:36

标签: c++ multithreading

有一个长时间的请求,并从“主”(UI)线程调用。计划将其调用移动到单独的线程中。问题是在堆上的这个线程中创建了一些对象(主线程必须使用这些指针)。

问题:

  1. 是否允许删除主线程中的“另一个线程”对象?
  2. 删除“另一个”主题中的对象是个好主意。

5 个答案:

答案 0 :(得分:4)

  1. 根据具体情况,这不是坏事也不好,只需按照你的算法做你需要的。

  2. 仅当对象析构函数与线程本地存储一起工作时,删除在另一个线程中创建的对象可能是危险的。这必须在课程文档中提及。

答案 1 :(得分:1)

没有什么可以阻止你这样做,虽然我不会建议。你最好使用shared_ptr或类似的对象恕我直言。

答案 2 :(得分:1)

这是安全的,但不要忘记竞争条件。像这样删除它:

//someObj

   if (someObj != null)
   {
      lock();
         if (someObj != null)
         {
            delete someObj;
            someObj = NULL;
         }
      unlock();
   }

答案 3 :(得分:0)

允许在另一个帖子中删除 但是:程序员的责任是确保所有者始终为人所知。 此外,在多线程环境中,您必须确保没有竞争条件,其他线程仍尝试访问该对象。但是,当创建线程删除对象时也是如此。解决这个问题的一个好方法是使用共享/弱指针; boost shared_ptr是线程安全的

答案 4 :(得分:0)

您可能需要查看Boost's shared_ptr。无论在哪个线程中创建它们,它都将为您处理释放对象,并且还可以省去跟踪哪些线程持有指向哪些对象的指针的麻烦。它也完全是线程安全的(你仍然需要保护你自己对象的内部工作,但其余部分会照顾你)。