什么是互斥?什么是同步?
互斥:一个资源一次只能被一个访问者使用(保证访问数据,唯一访问性)
举个例子:你去上厕所,门一开,人进去,门锁上,在你上厕所期间别人不能打扰
同步:当多个访问者一起工作时并对每个访问者访问的时序有一定限制(保证访问数据,时序访问性)
举个例子:你上完厕所,刚出来,本来应该由别人了,但是你此时又进去,你反复的进去出来,导致别人都上不了厕所。因此同步就是保证时序性的,你出来了,应该去后面排队。
为什么要同步与互斥?
1.在运行多个任务,都需要访问同一种资源-----------竞争
2.多个任务之间有依赖关系,某个任务的运行状态依赖于另一个任务
同步互斥就是解决这类问题的。
互斥和同步的联系?
同步是一种更为复杂的互斥,而互斥是一种特殊的同步。
也就是说互斥是两个任务之间不可以同时运行,他们会互相排斥,必须等待一个执行完再执行,而同步也是不能同时运行,但是必须要按照某种次序来运行。但是互斥不限制任务的执行顺序。(互斥任务是无序的,同步任务是有序的)
线程如何实现互斥
互斥量 :是一个可以处于两态之一的变量,解锁和加锁。用来保护临界资源的。当你访问临界资源的时候,先要申请锁,如果别人还没释放你就被阻塞,如果没人用你就可以加锁,这样就很有效的保证临界资源一段时间内只能被一个人访问。
互斥量接口如下:
互斥量使用注意事项:
1.初始化互斥量(程序起始)
2.加锁操作(进入临界区之前)
3.解锁操作(出临界区之后)注意:你加锁了,在有可能退出的地方都要解锁,否则会出现死锁问题
4.销毁互斥量(程序结束前)
下面看一个例子,购票ticket--,不是一个原子操作,有可能在sleep的时候被切出去,造成错误判断的问题,因此进入临界区的时候要进行加锁。
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
int ticket = 100;
pthread_mutex_t mutex;
void * get_ticket(void *arg)
{
int id = (int)arg;
while (1)
{
pthread_mutex_lock(&