【问题标题】:How do I pass a pointer to a class object between threads and have it persist after the main thread finishes executing?如何在线程之间传递指向类对象的指针并在主线程完成执行后使其保持不变?
【发布时间】:2011-04-19 15:03:21
【问题描述】:

这是我遇到的问题:

主线程创建类对象(mybaseclass* local = new childclass;),这些对象本质上是知道它们应该做什么的命令。然后它将指向类对象的指针通过套接字传递给分叉线程,然后主线程处理完该对象并返回等待其他一些输入。分叉的线程然后从队列中读取指针,但是当主线程完成时,指针指向的类对象已经被自动删除。主线程执行完毕后,如何让类对象持久化?

谢谢! 杰夫

【问题讨论】:

  • 在堆上手动分配的对象(即new不会自动删除...
  • 没有定义主线程结束后发生的事情(因为 C++ 没有线程)。但是在大多数系统中,一旦主线程退出,所有其他线程都会因极端偏见而被杀死(它们不会继续运行)。因此,您的主线程应该等待所有其他线程完成后再离开 main()。
  • 重新阅读你的解释不清楚你是否真的在使用线程。从您使用forkedspawned 的词以及您通过套接字传递对象的事实来看。它表明您正在使用多个进程。进程不共享内存,因此传递指针是徒劳的。
  • 像往常一样,如果您发布代码而不是英文描述,这将更容易解决。

标签: c++ multithreading class pointers object


【解决方案1】:

使用 new 关键字在堆上分配的对象不会在线程完成时自动删除。如果您确定它会被自动删除,那么您可能在其他地方遇到了错误。否则,指针仍应指向有效对象。

【讨论】:

    【解决方案2】:

    在您的主线程中,使用new 在免费商店中创建您的对象:

    mybaseclass* local = new childclass;

    ...确保不要使用智能指针,因为智能指针会在超出范围时破坏对象。通过您使用的任何方式将指针传递给您的工作线程,然后当您的工作线程完成它时,将其删除:

    mybaseclass* thread_local = SomehowGetTheObject();
    // MAGIC HAPPENS...
    delete thread_local;
    

    此外,如果您将基指针传递给派生类,请确保您的基类具有 virtual 析构函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-03
      • 2015-03-25
      • 1970-01-01
      • 2022-07-25
      • 2011-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多