您的位置:首页 > 其它

线程之间的同步和互斥

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()

等函数类似,其函数参数只有信号量指针。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: