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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!