【Linux高级环境编程】线程同步的封装

网友投稿 480 2022-05-29

文章目录

线程同步的概念

一、互斥量

1.1、互斥量概念

1.2、互斥量初始化

1.3、互斥量的销毁

1.4、互斥量的加锁与解锁操作

1.5、回忆锁的语义:尝试锁

1.6、互斥量的操作顺序

二、线程安全版本地CLLogger类

三、互斥量的封装

四、条件变量及其封装

五、事件对象的封装

线程同步的概念

通常,对一个存储单元的访问,要经历三个步骤:

将内存单元中的数据,读入寄存器

对寄存器中的值进行运算

将寄存器中的值,写回内存单元

无锁时出错的情况:

一、互斥量

1.1、互斥量概念

可以通过使用pthread的互斥接口保护数据,确保同一时间里只有一个线程访问数据。

互斥量mutex,本质上就是一把锁:

在访问共享资源前,对互斥量进行加锁

在访问完成后释放互斥量上的锁

对互斥量进行加锁后,任何其他试图再次对互斥量加锁的线程将会被阻塞,直到锁被释放

1.2、互斥量初始化

互斥量在使用前,必须要对互斥量进行初始化,函数原型:

#include int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);

1

2

3

参数与返回值:

mutex:即互斥量,类型是pthread_mutex_t

注意:mutex必须指向有效的内存区域

attr:设置互斥量的属性,通常可采用默认属性,即可将attr设为NULL

成功返回0,出错返回错误码

1.3、互斥量的销毁

互斥量在使用完毕后,必须要对互斥量进行销毁,以释放资源:

#include int pthread_mutex_destroy(pthread_mutex_t *mutex);

1

2

3

参数与返回值:

mutex:即互斥量

成功返回0,出错返回错误码

1.4、互斥量的加锁与解锁操作

在对共享资源访问之前和访问之后,需要对互斥量进行加锁和解锁操作,函数原型:

#include int pthread_mutex_lock(pthread_mutex_t *mutex); Int pthread_mutex_unlock(pthread_mutex_t *mutex);

1

2

3

4

成功返回0

1.5、回忆锁的语义:尝试锁

当使用pthread_mutex_lock时,若已被加锁,则调用线程将被阻塞。有没有办法让线程不阻塞,即实现非阻塞的语义。函数原型:

#include int pthread_mutex_trylock(pthread_mutex_t *mutex);

1

2

3

调用该函数时,若互斥量未加锁,则锁住该互斥量,返回0;若互斥量已加锁,则函数直接返回失败,即EBUSY

1.6、互斥量的操作顺序

定义一个互斥量pthread_mutex_t

调用pthread_mutex_init初始化互斥量

调用pthread_mutex_lock或者pthread_mutex_trylock对互斥量进行加锁操作

调用pthread_mutex_unlock对互斥量解锁

调用pthread_mutex_destroy销毁互斥量

示例3.12(在示例3.8基础之上)

二、线程安全版本地CLLogger类

三、互斥量的封装

【Linux高级环境编程】线程同步的封装

四、条件变量及其封装

五、事件对象的封装

linux 任务调度

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Win之Software Installation:谷歌地球(Google Earth) 的简介、安装、使用方法之详细攻略
下一篇:adb无线调试手机-android必备技能
相关文章