2 hrdzkj hrdzkj 于 2016.03.24 10:46 提问

linux fork多线程的问题

各位大师,我看fork函数,这个问题困扰了好久。请各位大师赐教。

既然replicated了other pthreads objects,为什么child process 只有 a single thread呢?
图片说明

图片中介绍来源: http://linux.die.net/man/2/fork

9个回答

Dennis_Zip
Dennis_Zip   2016.03.24 11:55
已采纳

sorry, 第一次回答得不准确,重新解释下:
由fork()产生的子进程只带有一个控制线程,该线程实际上就是父进程中调用fork()函数的控制线程,而如果父进程中有多个线程的话,子进程实际上并不会把这些线程都继承过来。上述中的 other pthreads objects这里的意思其实并不是指线程,而是包含了 mutexes、condition variables等这些线程相关对象资源。也正是因为这个原因,所以在多线程中使用fork()是比较危险的,因为子进程只是继承了父进程中的多线程同步和锁等资源对象,但是并不会继承父进程中的多线程本身。不过由于现在系统都是 copy on write(写时复制),所以在子进程中如果执行 exec 不会造成因上述情况存在的死锁等问题。

Dennis_Zip
Dennis_Zip   2016.03.24 11:07

a single thread 指的是内核级线程
other pthreads objects 指的是用户级线程

george_xiaoqiao
george_xiaoqiao   2016.03.24 11:13

线程依附于进程之下,而各进程间是相互独立的。如果主线程关闭的话,那其子线程也会关闭,而主进程结束了,其子进程还在继续远行着。所以fork()一个子进程来运行一个简单功能,应该是为了当主进程关闭时,这个简单功能的子进程还可以继续运行。

hrdzkj
hrdzkj   2016.03.24 13:18

Dennis_Zip 的解答,真的太好了。这个问题理解了。非常感谢。另外看到《Linux内核设计与实现 第3版》3.4节中的这句话。
图片说明

请问:多线中,thread_info与task_struct 是什么关系,是一对一,多对一,还是其他?

hrdzkj
hrdzkj   2016.03.24 13:19

还有,多线程中,进程内核栈是否共享?

fanyun_01
fanyun_01   2016.03.24 13:20

fork()函数创建一个简单的子进程,不会锁住,而多线程使用fork()比较危险,需要考虑同步和锁

fanyun_01
fanyun_01   2016.03.24 13:21

fork()函数创建一个简单的子进程,不会锁住,而多线程使用fork()比较危险,需要考虑同步和锁

fanyun_01
fanyun_01   2016.03.24 13:20

fork()函数创建一个简单的子进程,不会锁住,而多线程使用fork()比较危险,需要考虑同步和锁

hrdzkj
hrdzkj   2016.03.24 14:26

明白了。想结贴给分了,找不到怎么结贴。请问在哪里结贴的?????

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
linux下使用多线程的fork和system会出现问题
根据我的经验,linux下使用pthread库写多线程程序时,在调用系统调用/库函数方面,应注意至少如下几点: 1、创建了线程后,不要再使用fork()/vfork()创建子进程 2、尽量不使用signal机制 3、...   关于1,有个具体的教训。我实现了一个动态库,该库的功能在一个独立线程里运行。同事A实现了另一个动态库,库的功能在也一个独立线程里运行。这两个库
每天进步一点点——论fork()函数与Linux中的多线程编程
fork()函数的调用会导致在子进程中除调用线程外的其它线程全都终止执行并消失,因此在多线程的情况下会导致死锁和内存泄露的情况。在进行多线程编程的时候尽量避免fork()的调用,同时在程序在进入main函数之前应避免创建线程,因为这会影响到全局对象的安全初始化。
【Linux】利用fork()创建多个线程
在《【Linux】fork()》(点击打开链接)只是简单交代了如同利用fork()创建子线程的方法,实际是更应该说将一个程序一分为二的方法。还有很多事情隐藏在其中值得细致思考。由于fork()结构的特殊性,如果要用fork()创建多个线程,并不像pthread_create()那样轻松,而且最关键的一点,是你利用for循环和fork()创建出来的多线程,会不明不白地多出N条线程。这主要是由于对fo
localtime死锁——多线程下fork子进程
介绍localtime非信号安全,并且在多线程下,fork子进程出现死锁的原因
clone的fork与pthread_create创建线程有何不同&pthread多线程编程的学习小结
进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合,这些资源在Linux中被抽 象成各种数据对象:进程控制块、虚存空间、文件系统,文件I/O、信号处理函数。所以创建一个进程的 过程就是这些数据对象的创建过程。   在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于 父进程,具有良好的并发性,但是二者之间的通讯需要通过专门的通讯
一起来探讨Linux中fork与mutex的混合使用
Linux互斥锁和fork
Java多线程之~~~Fork/Join框架的同步和异步
在Fork/Join框架中,提交任务的时候,有同步和异步两种方式。以前使用的invokeAll()的方法是同步的,也就是任 务提交后,这个方法不会返回直到所有的任务都处理完了。而还有另一种方式,就是使用fork方法,这个是异步的。也 就是你提交任务后,fork方法立即返回,可以继续下面的任务。这个线程也会继续运行。 下面我们以一个查询磁盘的以log结尾的文件的程序例子来说明异步的用法
多线程IO操作(fork-join版)
接着上篇中没写完的(http://my.oschina.net/bluesroot/blog/223453),上篇中讲到很多,为完成对一个目录的扫描的频繁的IO操作,我们从单线程到多线程,从CountDownLatch到BlockingQueue,中间不免各种Callable和Future和ExecutorService等等,虽然纷繁,中间有些不免麻烦,但是最终仍紧紧贴着我们的需求和多线程操作这一
fork 进程 pthread_create线程
<br />Introduction<br />Details<br /> <br />一个进程就相当于一个主线程。<br /> <br />fork一个进程与create一个线程的区别: <br />fork进程:子进程复制父进程的进程环境。父进程结束不会影响子进程的运行。进程切换复制进程环境。 <br />create线程:子线程共享父线程的线程环境。线程(一个主线程下的多个线程)切换不复制环境,所以线程运行快,省去了复制环境的时间。主线程运行结束,子线程的运行就无意义了。 <br /> <br />子
科学家进餐问题
package 科学家进餐问题; /*每个哲学家相当于一个线程*/ class Philosopher extends Thread{ private String name; private Fork fork; public Philosopher(String name,Fork fork){ super(name); this.name