-
一、概念
线程是轻量级的进程,被包含在进程之中,多个线程使用同一片进程空间。进程是操作系统资源分配的最小单位 ,线程是操作系统运算调度的最小单位。
-
二、优/劣势
优势:解决了进程间切换耗费时间的问题,由于使用同一片内存空间,因此通信会更加简单(使用全局变量)。
劣势:由于线程共享同一片内存空间,因此会存在资源竞争的问题,可使用同步、互斥机制来解决,同步机制可以确保多个线程按照一定的顺序执行,而互斥机制可以保证在同一时间只有一个线程访问共享资源。
-
三、线程公/私有数据
线程公有数据:全局变量、静态变量(static)、动态分配的内存(malloc);文件描述符(上限1024)。
线程私有数据:线程id号(tid)、堆栈(局部变量)、错误号。
-
四、线程的使用
线程的调用属于外部库,在编译时需要链接库:
gcc c语言源程序 -l pthread
-
五、线程相关函数
1、pthread_create:创建线程
int pthread_create(pthread_t *thread,const pthread_attr_t *attr,void *(*start_routine)(void *),void *arg);
第一个参数:可获取线程id,是用于接收线程id的变量的地址;
第二个参数:通常用NULL表示创建的线程使用默认属性,是存储线程属性的结构体变量地址;
第三个参数:线程执行函数的入口地址(指针函数指针)指向返回值为void*类型,参数为void*类型的函数;
第四个参数:给线程执行函数传递的参数。
2、pthread_exit:退出线程
执行效果类似于return
3、pthread_join:阻塞等待指定线程退出
4、pthread_cancel:取消线程
可在不同线程中取消另一个线程
-
六、线程间通信
由于线程间使用同一片进程空间,因此通信过程实际上非常简单,使用全局变量进行数据的传递,多个线程可同时访问资源,同步、互斥两种机制用于解决访问共同资源时的问题。
-
七、同步、互斥机制
同步:
解决执行的顺序问题,使程序可以按照指定的顺序执行
信号量机制:P-V+
函数接口:
sem_init:初始化信号量
sem_wait:申请资源(P操作)
sem_post:释放资源(V操作)
使用一个信号量可能会出现供大于求的问题,因此应该使用两个信号量。
互斥:
解决程序中临界资源的竞争问题
函数接口:
pthread_mutex_init:初始化互斥锁
pthread_mutex_lock:申请互斥锁
pthread_mutex_unlock:释放互斥锁