一、线程定义
1、与进程类似,,线程是允许应用程序并发执行多个任务的一种机制。一个进程可以包含有多个线程。同一个程序中的所有线程均会独立执行相同的程序,且共享同一份全局内存区域,其中包括初始化数据段、未初始化数据段,以及堆内存段(Linux中的进程只是多线程程序的一个特例,该进程只包含一个线程)
2、进程是CPU分配资源的最小单位,线程是操作系统调度执行的最小单位。
3、线程是轻量级的进程LWP(Light Weight Process),在Linux环境下线程的本质是进程。
4、查看指定进程的LWP号:ps -Lf pid。
二、线程与进程的区别
1、进程间的信息难以共享。除去只读代码段外,父子进程并未共享内存,因此必须采用一些进程间通信方式,在进程间进行信息交换,例如进程间通信(fifo、pipe、mmap)。
2、调用fork()来创建进程的代价较高,即便利用写时复制,仍然需要复制诸如内存页表和文件描述符表之类的多种进程属性,这意味着fork()调用在时间上依然不菲。
3、线程之间能够方便、快速共享信息。只需将数据复制到共享(全局或堆)变量中即可。
4、创建线程要比创建进程快10倍不止,线程间是共享虚拟空间的,无需采用写时复制内存,也无需复制页表。
三、线程间共享和非共享资源
共享资源:进程ID和父进程ID 、进程组ID和会话ID、用户ID和用户组ID、文件描述符、信号处置、文件权限掩码、当前工作目录、虚拟地址空间(除栈、.txt).
非共享资源:线程ID、信号掩码、线程特有数据、error变量、实时调度策略和优先级、栈、本地变量和函数调用。
四、线程函数的学习
1、创建线程
一般情况下,main函数所在的线程称之为主线程,其余创建的线程称之为子线程。
程序中默认只有一个进程,调用一次fork()函数就会产生两个进程。
程序中默认只有一个线程,调用一次pthread_creat()函数就会产生两个线程。
#include <pthread.h>
int pthread_create(pthread_t *pthread,const pthread_attr_t *attr,void *(*start_rountn)(void *),void *arg);
-功能:创建一个子线程
-参数:
-pthread:传出参数,线程创建成功后,子线程的线程ID被写到该变量中。
-attr:设置线程的属性,一般使用默认值,NULL。
-start_routine:函数指针,这个函数是子线程需要处理的逻辑代码。
-arg:给第三个参数使用,传参
-返回值:
成功:0
失败:返回错误号。这个错误号和之前的errno不太一样
获取错误号信息:char *strerror(int errnum);
虽然下面的程序没有任何意义,但是非常突出的显示了这个函数的使用特点。
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
void *tfn(void *argc)
{
for(int i=0;i<5;++i)
printf("I am %dth child\n",i+1);
exit(0);
}
int main()
{
pthread_t pthread;
int ret=pthread_create(&pthread,NULL,tfn,NULL);
if(ret!=0)
{
printf("线程创建失败",strerror(ret));
}
while(1)//加一个死循环是为了一直等待子线程
{}
return 0;
}
所以输出结果为:
你学会了嘛?点个赞再走吧。