一、什么是线程
1.线程就是“轻量级”的进程。
2.线程与创建它的进程共享代码段,数据段。
3.线程拥有自己独立的栈。
二、函数学习
1创建线程
1).函数名
pthread_create
2).函数原型
int pthread_create(pthread_t *thread, const pthread_attr_t *attr ,void *(*start_routine)(void *), void *arg)
3).函数功能
创建一个新的线程
4).所属头文件
<pthread.h> 特别注意:编译时候必须链接pthread库
gcc –lpthread
5).返回值
成功:0
失败:错误编码
6).参数说明
thread:新创建的线程ID
attr:待创建线程的属性,一般为NULL
start_routine:线程的入口函数
arg:线程入口函数的参数,可以为NULL
2等待线程结束
1).函数名
pthread_join
2).函数原型
int pthread_join(pthread_t thread,void **retval)
3).函数功能
用于等待线程结束
4).所属头文件
<pthread.h> 特别注意:编译时候必须链接pthread库
gcc –lpthread
5).返回值
成功:0
失败:错误编号
6).参数说明
thread:要等待结束的线程id
retval:保存线程退出时的状态,一般为NULL
3退出线程
1).函数名
pthread_exit
2).函数原型
void pthread_exit(void *retval)
3).函数功能
结束线程
4).所属头文件
<pthread.h> 特别注意:编译时候必须链接pthread库
gcc –lpthread
5).返回值
空
6).参数说明
retval:保存返回值
三、线程互斥
在实际应用中,多个线程往往会访问同一数据或资源,为避免线程之间相互影响,需要引入线程互斥机制,而互斥锁(mutex)是互斥机制中的一种。
3.1互斥锁初始化
1).函数名
pthread_mutex_init
2).函数原型
int pthread_mutex_init(pthread_mutex_t *restrict mutex ,const pthread_mutexarrt_t *restrict attr);
3).函数功能
初始化互斥锁
4).所属头文件
<pathread.h>
5).返回值
成功:0
失败:错误的编码
6).参数说明
mutex:要初始化互斥锁的指针
attr:可以添加的属性,为空则为默认属性
3.2获取互斥锁
1).函数名
pthread_mutex_lock
2).函数原型
int pthread_mutex_lock(pthread_mutex_t *mutex);
3).函数功能
锁住互斥锁
4).所属头文件
<pthread.h>
5).返回值
成功:0
失败:错误的编码
6).参数说明
mutex:要锁住互斥锁的指针
3.3释放互斥锁
1).函数名
pthread_mutex_unlock
2).函数原型
int pthread_mutex_unlock(pthread_mutex_t *mutex);
3).函数功能
解开互斥锁
4).所属头文件
<pthread.h>
5).返回值
成功:0
失败:错误的编码
6).参数说明
mutex:要解开互斥锁的指针
四、实例学习
通过主函数创建两个进程,使这两个进程交互完成一项任务
1 #include <pthread.h> 2 #include <string.h> 3 #include <stdio.h> 4 5 pthread_t thread[2]; 6 int number = 0; 7 8 pthread_mutex_t mut; 9 10 void *worker1() 11 { 12 int i=0; 13 printf("I am worker1\n"); 14 for(i=0;i<10;i++) 15 { 16 pthread_mutex_lock(&mut); 17 number++; 18 pthread_mutex_unlock(&mut); 19 printf("worker1 number is %d\n",number); 20 sleep(1); 21 } 22 pthread_exit(NULL); 23 } 24 25 26 void *worker2() 27 { 28 int i=0; 29 printf("I am worker2\n"); 30 for(i=0;i<10;i++) 31 { 32 pthread_mutex_lock(&mut); 33 number++; 34 pthread_mutex_unlock(&mut); 35 printf("worker2 number is %d\n",number); 36 sleep(1); 37 } 38 pthread_exit(NULL); 39 } 40 41 int main() 42 { 43 pthread_mutex_init(&mut,NULL); 44 45 //创建工人1线程 46 pthread_create(&thread[0],NULL ,worker1,NULL); 47 48 //创建工人2线程 49 pthread_create(&thread[1],NULL ,worker2,NULL); 50 51 //等待工人1线程结束 52 pthread_join(thread[0],NULL); 53 54 //等待工人2线程结束 55 pthread_join(thread[1],NULL); 56 57 58 return 0; 59 }