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

举报
ReCclay 发表于 2022/02/22 00:15:20 2022/02/22
【摘要】 文章目录 线程同步的概念一、互斥量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);

  
 
  • 1
  • 2
  • 3

参数与返回值:

  • mutex:即互斥量,类型是pthread_mutex_t
    • 注意:mutex必须指向有效的内存区域
  • attr:设置互斥量的属性,通常可采用默认属性,即可将attr设为NULL
    • 成功返回0,出错返回错误码

1.3、互斥量的销毁

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

#include<pthread.h>

int pthread_mutex_destroy(pthread_mutex_t *mutex);

  
 
  • 1
  • 2
  • 3

参数与返回值:

  • mutex:即互斥量
  • 成功返回0,出错返回错误码

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

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

#include<pthread.h>

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<pthread.h>

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类

三、互斥量的封装

四、条件变量及其封装

五、事件对象的封装

文章来源: recclay.blog.csdn.net,作者:ReCclay,版权归原作者所有,如需转载,请联系作者。

原文链接:recclay.blog.csdn.net/article/details/109596865

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。