实现多线程分支

时间:2011-07-04 17:38:59

标签: c linux multithreading fork

我正在尝试检查多线程应用程序。对于单线程应用程序,将进程分支​​为检查点是一种有效的技术。但是,没有mulithreaded fork这样的东西。知道如何实现自己的多线程分叉?任何对此类工作的参考将不胜感激。

2 个答案:

答案 0 :(得分:4)

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

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

  2. 使用vfork后跟SIGSTOP来暂停父进程并让自己重新创建其线程状态,而不会在您身下发生变化。这似乎是可能的,但是我觉得很容易让人头疼,我想... ...

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

  4. 或者,您可以寻找一种基于内核的“进程休眠”方法来检查点,这种方法不会那么hackish ......

答案 1 :(得分:0)

“多线程叉”是什么意思?一个复制多线程进程的函数,以便forked进程拥有与旧进程一样多的线程?创建一个复制旧旧状态的新线程的函数?

后者是不可能的,因为地址空间是共享的。当前线程状态的副本将使用当前线程的堆栈,新线程和旧线程将在堆栈中进行争用。

另见: