【Linux高级环境编程】线程同步的封装
【摘要】
文章目录
线程同步的概念一、互斥量1.1、互斥量概念1.2、互斥量初始化1.3、互斥量的销毁1.4、互斥量的加锁与解锁操作1.5、回忆锁的语义:尝试锁1.6、互斥量的操作顺序
二、线程安全版本...
线程同步的概念
通常,对一个存储单元的访问,要经历三个步骤:
- 将内存单元中的数据,读入寄存器
- 对寄存器中的值进行运算
- 将寄存器中的值,写回内存单元
无锁时出错的情况:
一、互斥量
1.1、互斥量概念
可以通过使用pthread
的互斥接口保护数据,确保同一时间里只有一个线程访问数据。
互斥量mutex,本质上就是一把锁:
- 在访问共享资源前,对互斥量进行加锁
- 在访问完成后释放互斥量上的锁
- 对互斥量进行加锁后,任何其他试图再次对互斥量加锁的线程将会被阻塞,直到锁被释放
1.2、互斥量初始化
互斥量在使用前,必须要对互斥量进行初始化,函数原型:
#include<pthread.h>
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);
参数与返回值:
- mutex:即互斥量,类型是
pthread_mutex_t
- 注意:mutex必须指向有效的内存区域
- attr:设置互斥量的属性,通常可采用默认属性,即可将attr设为NULL
- 成功返回0,出错返回错误码
1.3、互斥量的销毁
互斥量在使用完毕后,必须要对互斥量进行销毁,以释放资源:
#include<pthread.h>
int pthread_mutex_destroy(pthread_mutex_t *mutex);
参数与返回值:
- mutex:即互斥量
- 成功返回0,出错返回错误码
1.4、互斥量的加锁与解锁操作
在对共享资源访问之前和访问之后,需要对互斥量进行加锁和解锁操作,函数原型:
#include<pthread.h>
int pthread_mutex_lock(pthread_mutex_t *mutex);
Int pthread_mutex_unlock(pthread_mutex_t *mutex);
成功返回0
1.5、回忆锁的语义:尝试锁
当使用pthread_mutex_lock时,若已被加锁,则调用线程将被阻塞。有没有办法让线程不阻塞,即实现非阻塞的语义。函数原型:
#include<pthread.h>
int pthread_mutex_trylock(pthread_mutex_t *mutex);
调用该函数时,若互斥量未加锁,则锁住该互斥量,返回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类
三、互斥量的封装
四、条件变量及其封装
五、事件对象的封装
文章来源: recclay.blog.csdn.net,作者:ReCclay,版权归原作者所有,如需转载,请联系作者。
原文链接:recclay.blog.csdn.net/article/details/109596865
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)