一、前情提要
1、获取线程ID
pthreae_self();
功能:获取线程号
返回值:线程ID
2、分离线程函数
int pthread_detach(pthread_t thread);
功能:使线程分离,线程退出时让系统自动回收线程资源
参数:线程ID
子线程在退出的时候,主线程没有给子线程回收资源的话,线程会变成僵尸线程。
使用方式:
1)在主线程中调用pthread_detach(tid);
2)在子线程中调用pthread_detach(pthread_self());
注意:1)如果线程已经设置了分离状态则再调用pthread_join时就会失败
2)pthread_detach与pthread_join如何选择?
当主线程中有希望有阻塞操作时,可以选择调用pthread_join回收线程
当主线程中有循环操作,希望子线程再结束时立马回收线程可以选择pthread_detach设置分离属性
3、取消线程
int pthread_cancel(pthread_t thread);
功能:向指定的线程发送取消请求
参数:thread:线程ID
返回值:成功:0;失败:错误码
pthread_testcancel()
功能:用于检查取消请求
二、线程同步
1、同步的概念:多个线程按照约定的顺序相互配合完成一件事
2、信号量:通过信号量实现线程之间的同步。信号量是用来决定线程是继续运行还是阻塞等待,它代表某一类资源,它的值代表系统中该资源的数量。信号量是一个受保护的量,只能通过三种操作来访问:初始化、P操作,V操作。其值为非负整数。
3、信号量特性:
P操作(申请资源):信号量的值大于0的时候,可以申请资源,申请成功后信号量的值减一,当信号量等于0的时候,无法申请资源,函数阻塞。
V操作(释放资源):不阻塞,执行到释放操作,信号量的值加一
4、信号量的分类:
1).posix信号量:
a. 无名信号量:数据存储在内存中,通常在线程间使用或父子进程间
函数接口:sem_init\sem_wait\sem_post
b. 有名信号量:数据存储在文件中,在进程间线程间都可以使用
函数接口:sem_open\sem_wait\sem_post\sem_close
2).System V信号量
是信号量的集合,叫信号灯集,属于IPC对象
函数接口:semget\semctl\semop
5、初始化信号量
int sem_init(sem_t *sem,int pshared,ensignes int value);
功能:初始化信号量
参数:sem:要初始化的信号量对象;pshared:信号量的共享范围(0:线程间使用,非0:1进程间使用);value:信号量的初值
返回值:成功:0;失败:-1
6、申请资源
int sem_wait(sem_t *sem);
功能:申请资源(P操作)
参数:sem:信号量对象
返回值:成功:0;失败:-1
注意:在函数进行的过程中,当信号量的值大于0的时候表示有资源可以是有,函数继续执行,当信号量的值等于0的时候表示没有资源可以使用,函数阻塞。
7、释放资源
int sem_post(sem_t *sem);
功能:释放资源(V操作)
参数:同上
返回值:同上
注意:释放一次信号量的值加一,函数不阻塞
三、线程互斥
1、互斥的概念:多个线程访问临界资源时,同一时间只能一个线程访问。(临界资源:多个线程共同访问的数据,一次仅允许一个线程所使用)
2、互斥锁
其实同步相当于另外一种的互斥,反过来说互斥是另一种同步吗?不是,因为互斥这里没有要求要顺序访问,我只是保证了这个资源在访问的时候只有一个线程来访问
通过互斥锁可以实现互斥机制,主要用来保护临界资源,每个临界资源都由一个互斥锁来保护,线程必须先获得互斥锁才能访问临界资源,访问完资源后释放该锁。如果无法获得锁,线程会阻塞直到获得锁为止。
互斥锁的操作方式:初始化
申请锁(上锁):阻塞
释放锁(解锁):非阻塞
注意:上锁和解锁需要成对存在
3、互斥锁初始化
int pthread_mutex_init(pthread_mutex_t *restrict mutex, pthread_mutexattr_t *attr)
功能:初始化互斥锁
参数:
mutex:互斥锁
attr:互斥锁属性 // 一般设置为NULL
返回值:成功 0
失败 -1
4、申请互斥锁
int pthread_mutex_lock(pthread_mutex_t *mutex)
功能:申请互斥锁
参数:mutex:互斥锁变量
返回值:成功:0;失败:-1
5、释放互斥锁
int pthread_mutex_unlock(pthread_mutex_t *mutex)
功能:释放互斥锁
参数:同上
返回值:同上
6、销毁互斥锁
int pthread_mutex_destory(pthread_mutex_t *mutex)
功能:销毁互斥锁
参数:同上