线程之间的同步和互斥
2016-12-27 17:57
225 查看
1.互斥锁线程控制
互斥锁是用一种简单的加锁方法来控制对共享资源的原子操作。
互斥锁只有两种状态,也就是上锁和解锁,可以把互斥锁看作某种意义上的全局变量。
在同一时刻只能有一个线程掌握某个互斥锁,拥有上锁状态的线程能够对共享资源进行操作。若其他线程希望上锁一
个已经被上锁的互斥锁,则该线程就会挂起,直到上锁的线程释放掉互斥锁为止。
互斥锁可以分为快速互斥锁、递归互斥锁和检错互斥锁。
这三种锁的区别主要在于其他未占有互斥锁的线程在希望得到互斥锁时是否需要阻塞等待。
快速锁是指调用线程会阻塞直至拥有互斥锁的线程解锁为止。
递归互斥锁能够成功地返回,并且增加调用线程在互斥上加锁的次数。
检错互斥锁则为快速互斥锁的非阻塞版本,它会立即返回并返回一个错误信息。
默认属性为快速互斥锁。
2.互斥锁线程控制
互斥锁的基本操作:
互斥锁初始化:pthread_mutex_init()
函数原型:intpthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *attr)
函数参数:mutex:互斥锁
attr:PTHREAD_MUTEX_INITIALIZER:创建快速互斥锁
PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP:创建递归互斥锁
PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP:创建检错互斥锁
互斥锁上锁:pthread_mutex_lock()
互斥锁判断上锁:pthread_mutex_trylock()
互斥锁解锁:pthread_mutex_unlock()
消除互斥锁:pthread_mutex_destroy()
pthread_mutex_lock()
pthread_mutex_trylock()
pthread_mutex_unlock()
pthread_mutex_destroy()
等函数类似,其函数参数只有互斥锁。
3.信号量线程控制
信号量也就是操作系统中所用到的PV原子操作,它广泛用于进程或线程间的同步与互斥。
信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问。
PV原子操作是对整数计数器信号量sem的操作。
一次P操作使sem减一,而一次V操作使sem加一。
进程(或线程)根据信号量的值来判断是否对公共资源具有访问权限。
当信号量sem的值大于等于零时,该进程(或线程)具有公共资源的访问权限;
相反,当信号量sem的值小于零时,该进程(或线程)就将阻塞直到信号量sem的值大于等于0为止。
4.关于信号量的函数操作:
sem_init()用于创建一个信号量,并初始化它的值。
函数原型:int sem_init(sem_t *sem,int pshared,unsigned int value)
函数参数:sem:信号量的指针
pshared:决定信号量能否在几个进程间共享,暂时取值为0,表示这个信号量是当前进程的局部信号量。
value:信号量初始化值
sem_wait()和sem_trywait()都相当于P操作,在信号量大于零时它们都能将信号量的值减一,
两者的区别在于若信号量小于零时,sem_wait()将会阻塞进程,而sem_trywait()则会立即返回。
sem_post():相当于V操作,它将信号量的值加一同时发出信号来唤醒等待的进程。
sem_getvalue():用于得到信号量的值。
sem_destroy():用于删除信号量。
sem_wait()
sem_trywait()
sem_post()
sem_getvalue()
sem_destroy()
等函数类似,其函数参数只有信号量指针。
互斥锁是用一种简单的加锁方法来控制对共享资源的原子操作。
互斥锁只有两种状态,也就是上锁和解锁,可以把互斥锁看作某种意义上的全局变量。
在同一时刻只能有一个线程掌握某个互斥锁,拥有上锁状态的线程能够对共享资源进行操作。若其他线程希望上锁一
个已经被上锁的互斥锁,则该线程就会挂起,直到上锁的线程释放掉互斥锁为止。
互斥锁可以分为快速互斥锁、递归互斥锁和检错互斥锁。
这三种锁的区别主要在于其他未占有互斥锁的线程在希望得到互斥锁时是否需要阻塞等待。
快速锁是指调用线程会阻塞直至拥有互斥锁的线程解锁为止。
递归互斥锁能够成功地返回,并且增加调用线程在互斥上加锁的次数。
检错互斥锁则为快速互斥锁的非阻塞版本,它会立即返回并返回一个错误信息。
默认属性为快速互斥锁。
2.互斥锁线程控制
互斥锁的基本操作:
互斥锁初始化:pthread_mutex_init()
函数原型:intpthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *attr)
函数参数:mutex:互斥锁
attr:PTHREAD_MUTEX_INITIALIZER:创建快速互斥锁
PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP:创建递归互斥锁
PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP:创建检错互斥锁
互斥锁上锁:pthread_mutex_lock()
互斥锁判断上锁:pthread_mutex_trylock()
互斥锁解锁:pthread_mutex_unlock()
消除互斥锁:pthread_mutex_destroy()
pthread_mutex_lock()
pthread_mutex_trylock()
pthread_mutex_unlock()
pthread_mutex_destroy()
等函数类似,其函数参数只有互斥锁。
3.信号量线程控制
信号量也就是操作系统中所用到的PV原子操作,它广泛用于进程或线程间的同步与互斥。
信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问。
PV原子操作是对整数计数器信号量sem的操作。
一次P操作使sem减一,而一次V操作使sem加一。
进程(或线程)根据信号量的值来判断是否对公共资源具有访问权限。
当信号量sem的值大于等于零时,该进程(或线程)具有公共资源的访问权限;
相反,当信号量sem的值小于零时,该进程(或线程)就将阻塞直到信号量sem的值大于等于0为止。
4.关于信号量的函数操作:
sem_init()用于创建一个信号量,并初始化它的值。
函数原型:int sem_init(sem_t *sem,int pshared,unsigned int value)
函数参数:sem:信号量的指针
pshared:决定信号量能否在几个进程间共享,暂时取值为0,表示这个信号量是当前进程的局部信号量。
value:信号量初始化值
sem_wait()和sem_trywait()都相当于P操作,在信号量大于零时它们都能将信号量的值减一,
两者的区别在于若信号量小于零时,sem_wait()将会阻塞进程,而sem_trywait()则会立即返回。
sem_post():相当于V操作,它将信号量的值加一同时发出信号来唤醒等待的进程。
sem_getvalue():用于得到信号量的值。
sem_destroy():用于删除信号量。
sem_wait()
sem_trywait()
sem_post()
sem_getvalue()
sem_destroy()
等函数类似,其函数参数只有信号量指针。
相关文章推荐
- 多线程篇(二)——线程之间的同步与互斥,关键段的使用
- 线程之间的同步与互斥
- [Linux C编程]线程之间的同步与互斥
- 线程之间的互斥和同步
- 线程面试题之三:父子线程和子线程之间的同步与互斥
- 线程之间的同步与互斥mutex
- 进程和线程之间互斥和同步区别
- 线程之间的同步与互斥
- Linux多线程编程(二)---线程之间的同步与互斥
- Linux多线程编程(三)---线程之间的同步与互斥进阶实验
- Linux多线程编程(二)---线程之间的同步与互斥
- Linux多线程编程(三)---线程之间的同步与互斥进阶实验
- java同步和互斥 : 线程之间通信
- 为了在线程间进行可靠的通信,也为了互斥访问,同步是必要的。
- 【IO进程】守护进程,线程创建、同步与互斥
- Linux线程浅析[线程的同步和互斥之线程读写锁]
- 同时创建多个线程,它们都访问一个对象中的同步方法,怎么确保第一个线程最先拿到对象锁,否则,怎么保证多个线程之间的有序通信
- java Thread:线程同步之互斥(1)
- 线程的同步与互斥:条件变量&信号量
- 秒杀多线程系列之⑤ 经典线程之同步 关键段实现互斥