实现一个multithreading的叉子

我正在尝试检查一个multithreading应用程序。 对于单线程应用程序,将进程作为检查点分叉是一种有效的技术。 但是,没有这样的东西像是一个mulithreaded叉子。 任何想法如何实施自己的髓膛叉? 任何参考这样的工作将不胜感激。

没有可移植的方式来实现fork的变体,它使用POSIX提供的接口保留所有的线程。 在一些系统上,比如Linux,你可以实现一个高度不可移植,高度脆弱的版本:

  1. 使用ptrace跟踪所有线程(以阻止它们),然后在子进程中创建新的内核线程来复制父进程中的每个线程,并为它们分配原始堆栈地址,指令指针,寄存器值等。您还需要修补线程描述符以知道他们的新内核空间线程标识符,如果线程正在查询线程标识符,则需要避免竞争条件。

  2. 使用vfork接着是SIGSTOP来暂停父进程,给自己一个机会来重新创建它的线程状态,而不需要改变你的东西。 这似乎是可能的,但足够困难,我会头疼,试图详细说明,我认为…

  3. (新添加)在分叉之前捕获信号处理程序中的每个线程,并将ucontext_t参数保存到信号处理程序。 然后fork和新的内核线程(使用clone ),让他们自己信号,​​然后覆盖ucontext_t信号处理程序获取信号处理程序返回到您要复制的原始线程的上下文。 当然,这将需要非常聪明的同步…

或者,你可以寻找一个基于内核的“进程休眠”方法检查点,这不会是如此hackish …

你是什​​么意思“多线程叉”? 一个复制多线程进程的函数,这样分叉进程和旧进程的线程一样多。 一个函数,使一个新的线程,复制旧的状态?

后者是不可能的,因为地址空间是共享的。 当前线程状态的副本将使用当前线程的堆栈,并且新线程和旧线程将打开堆栈。

也可以看看:

  • 多线程的叉子
  • 叉和现有的线程?