目录
5、线程间数据(栈区)的通信
5.1主线程给子线程传值
5.2子线程给主线程传值
pthread_exit()和pthread_join()配合使用
6、线程中需要解决的问题
由于线程共享进程的资源和地址空间,因此在对这些资源进行操作时,必须考虑到线程间资源访问的同步与互斥问题。
6.1互斥
多线程不允许同时访问临界资源。
6.1.1互斥锁的作用
引入互斥(mutual exclusion)锁的目的时用来保证共享数据操作的完整性。
互斥锁主要用来保护临界资源
每个临界资源都有一个互斥锁来保护,任何时刻最多只能有一个线程能访问该资源。
线程必须先获得互斥锁才能访问临界资源,访问完资源后释放该锁。如果无法获得锁,线程会阻塞直到获得锁为止。
互斥锁只有两种状态:上锁和解锁。
6.1.2互斥锁的基本函数
(1)互斥锁初始化:pthread_mutex_init()。
(2)互斥锁上锁:pthread_mutex_lock()。
(3)互斥锁判断上锁:pthread_mutex_trylock()。
(4)互斥锁解锁:pthread_mutex_unlock()。
(5)消除互斥锁:pthread_mutex_destroy()。
pthread_mutex_init()函数语法要点
#include<pthread.h>
int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *mutexattr);
mutex:互斥锁
Mutexattr:互斥锁属性,NULL表示缺省属性
返回值:成功 0,出错 返回错误码
pthread_mutex_lock()等函数语法要点
#include<pthread.h>
int pthread_lock(pthread_mutex_t *mutex);//加锁,若不成功则阻塞
int pthread_mutex_trylock(pthread_mutex_t *mutex);//加锁,若不成功则返回
int pthread_mutex_unlock(pthread_mutex_t *mutex);//解锁
int pthread_mutex_destroy(pthread_mutex_t *mutex);//删除互斥锁
mutex:互斥锁
返回值:成功 0,失败 -1
未加锁:
加锁:
6.2同步
多线程再访问临界资源时,按照一定的操作顺序来访问。
信号量:
有名信号量:多进程实现同步
无名信号量:多线程同步
信号灯集:多进程实现同步
6.2.1信号量的引用
信号量代表某一类资源,其值表示系统中该资源的数量,信号量的值为非负整数,它被用来控制对公共资源的访问。
信号量是一个受保护的变量,只能通过三种操作来访问
初始化 sem_wait() sem_trywait()
P操作(申请资源)-1 sem_wait() sem_trywait()
在信号量大于零时,他们都能将信号量值为零时,阻塞线程
V操作(释放资源)+1 sem_post()
将信号量的值加1,同时唤醒等待的线程。
6.2.2信号量的函数
int sem_init(sem_t *sem,int pshared,unsigned int value);
int sem_wait(sem_t *sem); //P操作
int sem_post(sem_t *sem);
int sem_trywait(sem_t *sem);
int sem_getvalue(se,_t *sem,int *svalue); //获得信号量的值
int sem_destroty(sem_t *sem); //删除信号量
init
#include<semaphore.h>
int sem_init(sem_t *sem,int pshared,unsignes int value)
参数 sem:初始化的信号量
pshaewd:信号量共享的范围(0:线程间使用 非0:进程间使用)
value:信号量初值
返回值 成功:0 出错:-1
wait
#include<semaphore.h>
int sem_wait(sem_t *sem) //P操作 >0
参数 sem:信号量 信号量>0 -1 申请资源
==0 阻塞线程
返回值 成功:0 出错:-1
post
#include<semaphore.h>
int sem_wait(sem_t *sem) //V操作 释放资源
参数 sem:信号量 +1唤醒阻塞的线程
返回值 成功:0 出错:-1