线程创建
1.线程的概念
线程是进程的一个执行流,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。 一个进程由几个线程组成(拥有很多相对独立的执行流的用户程序共享应用程序的大部分数据结构),线程与同属一个进程的其他的线程共享进程所拥有的全部资源。 进程——资源分配的最小单位,线程——程序执行的最小单位” 进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。 线程有自己的堆栈和局部变量,但线程没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
由于同一进程的多个线程共享同一地址空间,因 此Text Segment、Data Segment都是共享的,如果定义一个函数,在各线程中都可以调用,如果定义一个全局变量,在各线程中都可以访问到,除此之外,各线程还共享以下进程资源和环 境:
- 文件描述符表
- 每种信号的处理方式(SIG_IGN、SIG_DFL或者自定义的信号处理函数)
- 当前工作目录
- 用户id和组id
但是线程也有私有的资源:
- 线程id
- 上下文,包括各种寄存器的值、程序计数器和栈指针
- 栈空间
- errno变量
- 信号屏蔽字
- 调度优先级
在Linux 上线程函数位于libpthread共享库中,因此在编译时要加上-lpthread选项
### pthread_create函数
函数简介
pthread_create是UNIX环境创建线程函数
头文件
#include
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<pthread.h>
4 #include<unistd.h>
5
6 void myfun(void arg)
7 {
8 printf("child pthread is %lu\n",pthread_self());
9 return NULL;
10 }
11
12 int main()
13 {
14 pthread_t tid;
15 int ret = pthread_create(&tid,NULL,myfun,NULL);
16 if(ret != 0)
17 {
18 printf("create error\n");
19 return 0;
20 }
21 printf("parent tid id:%lu\n",pthread_self());
22 sleep(1);
23 return 0;
24 }
运行结果:
wz@wz-machine:~/linux/phread$ ./1
parent tid id:3075663616
child pthread is 3075660608
注:如果主线程先退出的话,子线程就不会被执行。