线程那些事儿
来源:互联网 发布:软件数据线最新 编辑:程序博客网 时间:2024/05/16 11:22
在多线程程序中,一个新的线程通常由一个进程调用phtread_create()函数而诞生的。新线程创建后,通常将这个进程称为主线程。你也许会有所迷惑:一个进程怎么会编程线程?此刻有几个线程,几个进程?
其实通过上文对线程、轻量级进程以及线程组之间关系的理解后,这个问题似乎也不难回答。我们可以将所有的进程都看作一个线程组,只不过普通进程的线程组只包含它自己一个线程,它不能与其他线程共享资源,只能独享自己的资源(而成为进程)。
对于多线程程序来说,一旦在进程内创建了一个线程,那么该进程也就摇身变成了一个线程。主线程和子线程共享“以前”那个进程所独享的资源。主线程和子线程之间是并列关系,不存在类似fork()函数那样的父子进程关系,这也就是不将创建线程的进程称为父线程的原因。
如果你还对上述的描述有所疑惑,那么通过下面的实验结果可以理解的更加深刻。下述的程序就是一个普通的线程创建,只不过主线程和子线程增加了延时以方便我们查看实验结果。
01
int
*
thread
(
void
* arg)
02
{
03
pthread_t newthid;
04
newthid = pthread_self();
//get the current thread's id
05
printf
(
"this a new thread and thread ID is=%lu\n"
, newthid);
06
sleep(500);
07
return
NULL;
08
}
09
10
int
main()
11
{
12
pthread_t thid;
13
14
printf
(
"main thread,ID is %lu\n"
, pthread_self());
//get the main thread's id
15
if
(pthread_create(&thid, NULL, (
void
*)
thread
, NULL) != 0) {
16
printf
(
"thread creation failed\n"
);
17
exit
(1);
18
}
19
20
printf
(
"my Id is %lu, new thread ID is %lu\n"
, pthread_self(), thid);
21
sleep(1000);
22
return
0;
23
}
我们带开一个终端(称为终端1)运行上述程序,再另一个终端(称为终端2)里使用ps -eLf命令查看系统当前的线程信息。
1
UID PID PPID LWP C NLWP STIME TTY TIME CMD
2
edsionte 2210 2208 2210 0 1 09:10 pts/0 00:00:00 bash
3
edsionte 2429 2210 2429 0 2 09:52 pts/0 00:00:00 ./createthread
4
edsionte 2429 2210 2430 0 2 09:52 pts/0 00:00:00 ./createthread
5
edsionte 2431 2208 2431 5 1 09:52 pts/1 00:00:00 bash
6
edsionte 2449 2431 2449 0 1 09:52 pts/1 00:00:00 ps -eLf
请注意上述信息中三类ID信息:PID,PPID和LWP。LWP是轻量级进程的pid,NLWP为线程组中线程的个数。下面对上述的实验结果作以解释。
1.运行实验程序的终端对应的pid为2210;
2.我们的实验程序产生了两个线程,其pid都是2429。这说明这两个线程是并列关系,它们属于同一个线程组,该线程组的pid为2429。
3.实验程序产生的两个线程的PPID均为2210,再次说明这两个线程之间没有父子关系,他们的父亲均为终端1对应的进程。
4.每个线程都与一个轻量级进程关联,因此两个线程的LWP不同,分别为2429和2430。
5.这两个线程形成一个线程组,因此他们对应的NLWP为2。
6.通过pid,ppid和LWP的分配情况可以看到,内核对于进程和轻量级进程的id分配是统一管理的,这源于他们使用相同的数据结构task_struct。
上述分析基本上用实验结果诠释了进程、线程和轻量级进程之间的关系。
- 线程的那些事儿
- 线程那些事儿
- 线程的那些事儿
- 线程那些事儿(转载)
- 线程池的那些事儿
- Android中线程那些事儿
- (1)线程的那些事儿
- 关于进程和线程的那些事儿
- Java那些事儿之线程安全
- 进程与线程之间那些事儿:
- 进程线程协程那些事儿
- 那些事儿
- .NET的那些事儿(7)——C#线程编程
- 【产品那些事儿】产品经理那些事儿
- 西工大:那些人儿、那些事儿
- 明朝的那些事儿
- 明朝那些事儿
- '符号连接'那些事儿
- ubuntu 固定IP
- LINUX下FORK的运行机制详细解析
- SAP增强总结-第一代增强
- HTML5 Local Storage( 本地存储) 的前世今生(一)
- Linux的配置安装步骤
- 线程那些事儿
- 2012_多校10若干题解
- 在游戏领域 性感的HTML 5不敌Flash
- HTML5本地存储(Local Storage) 的前世今生(二)
- 安装visual studio的囧(错误vc 9.0 runtime组件安装失败)
- 依赖倒置原则
- 让一个网页页面的提交按钮执行点击事件
- CentOS安全设置
- 关于发行手机应用的5项重要营销建议