线 程
线程 ===》linux 线程 ===》posix线程 ===》pthread库
1、线程的概念
线程是一个轻量级的进程
是一个进程中的多个任务
它是CPU调度的最小单位
2、线程的特点:
1、是第三方开发的库 ==》pthread库
编写时候要包含: pthread.h
编译的时候要加: -lpthread
2、资源共享
线程是进程中的任务,进程中
的公共资源,线程都可以使用。
3、执行效率
同一任务一般线程的执行效率要
高于进程,同时节省资源。
3、线程与进程的区别:
1、线程比进程多的共享资源:
执行的指令 静态数据 文件描述符
2、线程比进程的私有资源:
线程id,局部变量 返回地址
3、线程是CPU调度的最小单位,===》任务
进程是OS调度的最小单位。 ===》进程
4、线程的使用
线程的创建 ====》线程的操作 ===》线程的资源回收
pthread_create fun/pthread_exit pthread_join
4.1 线程的创建
#include <pthread.h>
int pthread_create(
pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine) (void *),
void *arg
);
功能:通过该函数可以在进程中创建一个线程。
参数:thread 创建好的线程id
attr 创建的线程属性,如果不做调整用NULL
strat_routine 回调函数,表示线程的执行函数
arg 线程的回调函数的参数
返回值:成功 0
失败 -1
验证:
1、ps aux ===>l 表示是多线程程序
2、pstree ===>{xxx} 表示进程中的线程名称以及个数。
pthread_self()
原型:pthread_t pthread_self(void);
功能:通过该函数可以获取当前线程的线程id
一般该值等于pthread_create的参数1 的值。
参数: 无
返回值:成功 获取到的tid
失败 -1;
4.2 线程的操作:
void * fun(char *arg) ===>线程执行函数
===》pthread_exit()
void pthread_exit(void *retval);
功能:线程中用于退出线程的函数
参数:retval 线程退出时候的返回值
如果没有则用NULL;
返回值:无
pthread_cancel()
原型:int pthread_cancel(pthread_t thread);
功能:由创建者进程用来杀死子线程用。
参数:thread 要结束的子线程tid
返回值:成功 0
失败 -1;
4.3 线程的资源回收
原型:int pthread_join(pthread_t thread,
void **retval);
功能:在创建线程的进程中执行该函数可以回收
退出任务的线程资源。
该函数会阻塞等待回收过程
参数:thread 要回收的目标线程id
retvarl 回收的线程退出状态
返回值:成功 0
失败 -1
练习:设计一个多任务线程程序,对一个公共变量进行
加法操作并将每个线程执行的结果打印输出。
包含线程的tid和变量的当前值,判断是否可以
在多线程中操作公共静态变量。
线程的返回值和传参数:
1、线程的返回值:
pthread_exit( ?) ===>pthread_join(?)
返回值类型:
1、数字
1.1
int * pa = malloc
*pa = 99;
void * ret ; pthread_join(tid,&ret);
*(int *)ret;
1.2
return ((void *)a);
(int)ret;
2、字符串
char * pc = malloc
pc = "asdf" 错误
strcpy(pc,"asdfasdf"); ///不太好
strcpy(pc,array);
pthread_join(tid,&ret);
printf("ret = %s \n",(char *)ret);
3、结构体
1、定义结构体
2、在子线程中给结构体变量申请空间并赋值
3、返回结构体指针
4、在主线程中回收子线程返回值
5、强制类型转换返回值为结构体类型
6、打印输出转换后的结构体成员变量
作业:
1、设计一个结构体,在子线程中给结构体赋值并返回
在主线程中打印输出结构体返回的成员值。
2、使用IO+线程+进程学习过的知识尝试如下功能:
将/etc目录中的所有.conf文件定时备份到指定目录
如果其中有文件大于5M 将该文件压缩并单独备份。
在执行过程中最好有日志记录。