一、前情回顾
chdir(); |
功能: 函数用于改变当前进程的工作目录。 |
参数:路径(Path):这是一个字符串参数,表示要切换到的目标目录的路径。 |
返回值: 成功:在成功改变当前工作目录时, 失败:如果因为某些原因(如路径不存在、权限不足等)无法改变目录, |
二、线程
轻量级进程 线程是cpu任务调度的最小单位
1.线程的创建
线程由某个进程创建,从属于某个进程。
1.1内容:
由所在进程为其分配独立的的栈区空间(默认8M),其他空间(堆区、数据区、文本区)共享给所有线程,内核存储线程控制块。
1.2特点:
线程是cpu任务调度的最小单位
进程是操作系统资源分配的最小单位
1.3线程与进程的区别:
1.线程是cpu任务调度的最小单位
进程是操作系统资源分配的最小单位
2.线程是一个轻量级的进程,所在进程为其分配独立的栈区空间
3.资源消耗:进程>线程
4.效率角度:线程的创建速度>进程 线程任务切换>进程
5.安全角度:多进程>多线程 各个进程相互独立,线程资源共享
6.通信角度:多线程>多进程 线程间数据共享更方便,进程是独立的需要使用进程间通信的通信方法。
2.线程的调度
宏观并行,微观串行
操作系统调度
3.线程的消亡
3.1线程的消亡
3.2回收线程
return pthread_exit()
4.编程:
#include <pthread.h>
编译链接 -pthread
int pthread_create(pthread t *thread, const pthread_attr_t *attr,void *(*start routine)(void*),void *arg); |
功能:创建一个线程在被调的进程中 |
参数: pthread t *thread:保存线程ID的变量的地址 const pthread_attr_t *attr:设置线程属性对象的地址 NULL:按照线程默认属性去创建 void *(*start routine)(void*):回调函数:线程启动后需要执行的任务的入口地址 void *arg:作为回调函数的参数被传参。 |
返回值: 成功:=0 失败:!0 |
pthread_t pthread_self(void); |
功能:获得线程的tid号 |
返回值: 总是成功:tid |
int pthread_join(pthread_t thread,void **retval); |
功能:阻塞等待回收线程资源 |
参数: thread:需要回收的线程tid retval: 线程退出时,传递给回收线程的参数 |
返回值: 成功:0 失败:!0 |
void pthread_exit(void*retval); |
功能:退出一个线程 |
参数:指向返回值的指针 |
对于创建线程的进程,无合适机会回收线程资源时,可以将线程设置成具有分离属性的线程。
线程属性:
线程的分离属性:线程结束时,不需要其他线程回收,会被操作系统自动回收。//孤儿进程
线程的非分离属性:可以被其他线程回收或者结束。pthread_join或者结束 //僵尸进程
设置线程的分离属性:
1.定义线程属性对象 pthread_attr attr
2.初始化线程属性对象 int pthread_attr_init(pthread_attr_t *attr)
3.设置线程的分离属性 int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate)
PTHREAD_CREATE_DETACHED
4.以分离属性创建线程 int pthread_create(..., const pthread_attr_t *attr,...);
5.销毁线程属性对象 int pthread_attr_destroy(pthread_attr_t *attr)
5.线程之间的通信
通过pthread_create给线程任务传参
int num=10;
pthread_create(,,,&num);
void *fun(void *arg)
{
int fnum =*(int *)arg;
}
全局变量的方式线程间通信
三、补充
1. 函数指针
一个指向函数的指针
2. 函数指针定义:
函数 : void fun(int a, int b);
函数返回值类型 (*指针名称)(函数的形参表);
定义了一个叫做"指针名称"函数指针。
指针:void (*pfun)(int , int);
3. 给函数指针赋值:
初始化:
void (*pfun)(int , int) = fun;//int *p = &a;
赋值:
void (*pfun)(int , int); // int *p;
pfun = fun; // p = &a;
4. 函数指针数组
把多个函数的地址组织存储在一个数组中
定义一个指针数组:
char * arg[5] = {NULL};
函数指针数组:
void (*arg[5])(int, int);
对数组进行初始化:
void (*arg[])(int, int) = {fun, fun1, fun2} ;
通过typedef重命名函数指针类型:
typedef int U32;
函数指针类型:void (*)(int , int); // int *;
typedef void (*Pfun_t)(int , int);
将函数指针类型重命名成Pfun_t类型
Pfun_t arr[5];
函数指针数组:
把多个函数的地址组织存储在一个数组中
定义一个指针数组:
char * arg[5];定义一个函数指针数组; 对函数指针数组初始化:
void (*argv[])(int ,int); void (*argv[5])(int ,int)={fun,fun1,fun2……};
通过typedef重命名函数指针类型:
typedef int U32;
函数指针类型:void (*)(int ,int);
typedef voidun_t)(int ,int)//将函数指针类型重命名成Pfun_t类型