在Linux中,pthread和fork的基本区别是实现方式和调度方式不同(如果有变化的话)。
我对两个类似的程序运行了strace,一个使用pthread,另一个使用fork,最后都使用了不同的参数进行了clone()系统调用。因此,我猜想在Linux系统上,这两者本质上是相同的,但是pthread在代码中更容易处理。
有人能给出详细解释吗?
编辑:也可以参考相关问题(链接)
在Linux中,pthread和fork的基本区别是实现方式和调度方式不同(如果有变化的话)。
我对两个类似的程序运行了strace,一个使用pthread,另一个使用fork,最后都使用了不同的参数进行了clone()系统调用。因此,我猜想在Linux系统上,这两者本质上是相同的,但是pthread在代码中更容易处理。
有人能给出详细解释吗?
编辑:也可以参考相关问题(链接)
pthread_create()
目的是在程序中创建一个新的线程,该线程具有与调用者相同的进程
同一进程内的线程可以使用共享内存进行通信。(小心!)
第二个线程将共享数据、打开文件、信号处理程序和信号处理方式、当前工作目录、用户和组ID。但新线程将拥有自己的堆栈、线程ID和寄存器。
继续类比;当创建一个新线程时,您的程序(进程)就像长出了第二只手臂,连接到同一个大脑。
默认情况下,分叉进程不与父进程共享内存空间和其他资源(例如文件句柄),而在同一进程中的线程共享这些资源。在线程间通信方面,共享内存可以更高效快速,但需要进行仔细同步以防止竞态条件。
由于同一进程中的线程共享内存空间,它们比每个拥有自己内存空间的分叉进程更节省内存。
fork
将有自己的生命。 (+1 for pointing at the most important difference in my opinion: memory is shared with the process, whereas fork
will live its own life.) - Matthieufork
和pthread_create
时性能差异的句子吗? - Felix Quehl在Linux中,系统调用clone
可以克隆一个任务,并且可以配置共享级别。
fork()
调用clone(最小共享)
,而pthread_create()
调用clone(最大共享)
。
由于需要复制表和为内存创建COW映射,因此fork的成本略高于pthread_create。
您应该查看clone
手册。
特别是,它列出了所有可能的克隆模式以及它们如何影响进程/线程、虚拟内存空间等等...
您说“在代码中处理线程更容易”:这是非常有争议的。编写无错误、无死锁的多线程代码可能是一项相当大的挑战。有时候,使用两个独立的进程可以使事情变得更简单。