【问题标题】:How to pause all threads in my process (stop the world)如何暂停我的进程中的所有线程(停止世界)
【发布时间】:2019-10-22 11:32:40
【问题描述】:

我正在编写一个垃圾收集器玩具,当我的 GC 开始收集时,我需要暂停正在运行的程序(停止世界 gc),C++ 可以这样做吗?

【问题讨论】:

  • 不是普通的 C++ AFAIK,但有像 SuspendThread() 这样的函数。
  • C++ 没有。操作系统是的。但是,您需要简明挂起的线程可能会离开进程的状态。假设在挂起时线程正在堆上持有锁(在新/删除的中间)。在该线程重新启动之前,该进程(包括 GC 线程)现在没有堆。这也适用于任何其他锁。
  • 您真的需要暂停所有个线程,还是只是在收集过程中锁定所有其他GC功能?也就是说,如果一个线程没有做任何与 GC 相关的事情,它是否需要暂停?
  • 此处报告了类似问题stackoverflow.com/questions/40544480/…
  • ".. 我会用 gc 阅读一些开源运行时..." 解释系统要容易得多,因为您可以在适当的点停止解释器。

标签: c++ garbage-collection


【解决方案1】:

您不能简单地冻结 C++ 中的线程,但您可能不想这样做。如果您正在进行垃圾收集,那么您肯定不想这样做,而某个线程正处于内存分配/取消分配的中间。您可能希望所有线程在常规基础上以某种方式屈服,可能使用信号量或全局互斥锁,以便 gc 可以在 gc'ing 之前等待它们全部达到该状态。当 gc 未激活时,可以直接将控制权交还给任何收益。

【讨论】:

    【解决方案2】:

    我通过使用 POSIX 信号库解决了这个问题。 首先,使用SIGRTMIN定义一个自定义信号

    其次,定义一个handler来处理这个信号并注册这个handler:

    signal(SIGRTMIN, stop_handler); // you should use sigact() instead
    

    最后,将此信号发送到应用程序线程:

    for (auto thread : threads) {
        if (thread != self) {
          pthread_kill(thread, SIGRTMIN);
        }
      }
    

    附:如何获取threads 因情况而异,在我的情况下,我在我的 gc 引用中添加线程注册,如果有人初始化了我的 gc 引用的实例,我会知道获取线程。

    附:关于为什么大部分 GC 会暂停整个程序,查看this

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-09
      • 2016-03-26
      • 1970-01-01
      • 2013-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多