-
- 1.从内存读变量值到寄存器。
- 寄存器加1。
- 将寄存器的值写回内存。
- 初始化函数和销毁函数
pthread_mutex_init函数对Mutex做初始化,参数attr设定Mutex属性,若attr为NULL,则表示缺省属性。 pthread_mutex_destroy可以销毁Mutex。 若Mutex是静态分配的(全局变量或static变量),可以用宏定义PTHREAD_MUTEX_INITALIZER来初始化,相当于pthread_mutex_init初始化并且attr参数为NULL返回值:成功返回0,失败返回错误号
- Mutex的加锁和解锁
一个线程可以调用pthread_mutex_lock获得Mutex。如果这时另一个线程已经调用pthread_mutex_lock获得Mutex,则当前线程需要挂起等待,直到另一个线程调用pthread_mutex_unlock释放Mutex,当前线程被唤醒,才能获得该Mutex继续执行 若一个线程既想获得锁又不想挂起等待,可以调用pthread_mutex_trylock,如果Mutex已经被另一个线程获得,这个函数返回EBUSY而不会使线程挂起等待。返回值:成功返回0,失败返回错误号例
- 互斥锁实现原理:
- 死锁:
2.条件变量 线程间同步时,若线程A需要等某个条件成立时才能继续往下执行,若这个条件不成立,则A阻塞等待,若线程B在执行的过程中使这个条件成立,则唤醒线程A继续等待这个条件的线程。 条件变量用pthread_cond_t 类型变量表示
- 初始化和销毁
返回值:成功返回0失败返回错误号 条件变量和锁和搭配使用的。
例子:单生产者单消费者模型一个线程不断从链表中头插数据,一个线程不停的取数据。1.必须保证放完才能拿,拿完才能放。生产者和消费者是互斥关系,还需要一定的顺序,同步。2.生产者之间互斥,消费之间是竞争关系3.交易场所只有一个,数据缓存(数组、链表等可以保持数据特性的结构)4.3种关系,两种角色,一个交易场所。
3、Semaphore信号量 Mutex变量非0即1,可以看做一种资源的可用数量,初始化Mutex为1,表示有1个资源可用,加锁时获得该资源。Mutex减到0,表示不再有可用资源,解锁时释放该资源,Mutex重新加到1,表示又有了一个可用资源。 信号量和Mutex类似,表示可用资源的数量,和Mutex不同的是这个数量可以大于1。
- 信号量的函数
②等待 获得资源(相当于P操作),时semaphore值减1,如果调用wait值为0则挂起等待
③释放资源(V操作) 使semphore值加1,同时唤醒挂起等待的进程
④destroy
例 上面生产-消费模型是基于链表的,其空间动态分配,现在基于固定大小的环形队列重写程序。通过信号量同步,不用锁 注意: 环形生产消费模型:生产者不能超过消费者,会覆盖原有数据,消费者也不会超过生产者,会读到空数据 判空方法:1.加计数器 2.预留一个空间 对于生产者:只有当不满的的时候才可以生产,看重空间资源(space) 对于消费者:只有当有数据才读取,看重数据资源(data)