当前位置: 技术问答>linux和unix
关于linux进程和线程的疑问!请教达人!
来源: 互联网 发布时间:2016-10-06
本文导语: Q1:apue中提到线程的优点时,有一点:多线程编程能够简化处理异步事件的代码。 异步事件指什么呢?多线程又是如何简化的? Q2:进程创建了多个线程后,我在线程中getpid()确认这些线程的pid都是进程本身的...
Q1:apue中提到线程的优点时,有一点:多线程编程能够简化处理异步事件的代码。
异步事件指什么呢?多线程又是如何简化的?
Q2:进程创建了多个线程后,我在线程中getpid()确认这些线程的pid都是进程本身的pid;有介绍说linux的任务调度是以
进程为单位的,那么它如何调度这个进程和它下面的多个任务的呢?或者说线程如何调度呢?
Q3: fork()之后,子进程复制父进程的互斥量(mutex),因此fork之后的子进程调用系统函数或者获取互斥量时很可能导致死
锁。这也是pthread_atfork函数主要处理的问题。
我的疑问是:互斥量是全系统可见的吗?我一直以为它是进程内部线程之间可见的东西。
异步事件指什么呢?多线程又是如何简化的?
Q2:进程创建了多个线程后,我在线程中getpid()确认这些线程的pid都是进程本身的pid;有介绍说linux的任务调度是以
进程为单位的,那么它如何调度这个进程和它下面的多个任务的呢?或者说线程如何调度呢?
Q3: fork()之后,子进程复制父进程的互斥量(mutex),因此fork之后的子进程调用系统函数或者获取互斥量时很可能导致死
锁。这也是pthread_atfork函数主要处理的问题。
我的疑问是:互斥量是全系统可见的吗?我一直以为它是进程内部线程之间可见的东西。
|
Q1, asynchronous events are those occurring independently of the main program flow. 多线程本来就是异步的。说白了就是同一个进程同时做多个没有不同的事情。
Q2, 线程的调度是由线程库完成的
Q3, mutex只在进程内可见, 但是linux fork出的子进程是单线程的,而有些mutex的状态不是由调用线程控制,所以mutex状态混乱会导致子进程死锁。
Q2, 线程的调度是由线程库完成的
Q3, mutex只在进程内可见, 但是linux fork出的子进程是单线程的,而有些mutex的状态不是由调用线程控制,所以mutex状态混乱会导致子进程死锁。
|
Q1,异步事件比如信号
多线程编程时,可以单独创建一个线程,专职等待并处理信号,这样就类似同步的处理方式了。能够简化处理代码
Q2,不是很懂
貌似是lwp的概念,即轻量级进程,与getpid获取的不是一个概念
Q3,提一下,互斥锁允许设置进程间共享属性。锁本身可以放在共享内存中,这样就是全系统可见的了
多线程编程时,可以单独创建一个线程,专职等待并处理信号,这样就类似同步的处理方式了。能够简化处理代码
Q2,不是很懂
貌似是lwp的概念,即轻量级进程,与getpid获取的不是一个概念
Q3,提一下,互斥锁允许设置进程间共享属性。锁本身可以放在共享内存中,这样就是全系统可见的了
|
Q2. Linux线程的实现实际上分两种:用户级和内核级。用户级别线程调度是由线程库完成的。而内核级的线程与进程在内核中是一样的,每个线程也都有相应的pid,有自己独立的栈空间,只不过这些线程之间共享同一个地址空间。所以Linux下的getpid()实际上返回的是线程组ID,且由内核统一调度。
在一些旧版本的Linux系统中,每个线程调用getpid()返回的结果是不一样的,但相应的线程组ID的一致的。
在一些旧版本的Linux系统中,每个线程调用getpid()返回的结果是不一样的,但相应的线程组ID的一致的。
|
Q3. 这里的死锁一般是指是多线程程序在fork()之后很容易导致的死锁。
具体例子,见http://blog.csdn.net/hanchaoman/archive/2010/06/22/5685582.aspx
多线程尽量不用fork(),如果有需要,直接再多创建几个线程,效果应该差不多。
具体例子,见http://blog.csdn.net/hanchaoman/archive/2010/06/22/5685582.aspx
多线程尽量不用fork(),如果有需要,直接再多创建几个线程,效果应该差不多。