当前位置: 首页 > news >正文

重入和线程安全

在整个文档中,重入和线程安全用于标记类和函数,从而表明怎样在多线程应用中使用它们。

  • 线程安全函数可以从多个线程同时调用,即使调用使用共享数据也是如此,因为对共享数据的所有引用都是序列化的。
  • 也可以从多个线程同时调用重函数,但前提是每个调用都使用自己的数据

以上可以得出结论: 线程安全函数始终是可重入的,但可重入函数并不总是线程安全的

通过扩展,如果可以从多个线程安全地调用一个类的成员函数,只要每个线程使用该类的不同实例,则该类就被称为可重入类。如果可以从多个线程安全地调用该类的成员函数,则该类是线程安全的,即使所有线程都使用该类的同一实例也是如此。

重入:

c++类通常是可重入的,因为它们只能访问自己的成员数据。任何线程都可以在可重入类的实例上调用成员函数,只要没有其他线程可以同时调用该类的同一实例上的成员函数。

例如:

class Counter
{
public:Counter() { n = 0; }void increment() { ++n; }void decrement() { --n; }int value() const { return n; }private:int n;
};

上面的类是可重入的,但这并不是线程安全的,当有多个线程同时修改类的一个成员变量,可能会

会产生多种结果 。因为++和--的操作并不是总是原子的(原子操作是指一个操作不会被其他线程中断)。它们会分为3个机械指令:

  • 在寄存器中加载变量的值
  • 递增或递减寄存器的值
  • 将寄存器的值存储回主存储器

当有多个线程同时加载变量的旧值,然后递增它们的寄存器,然后将其存储回去,最终它们会相互覆盖,变量只会递增一次。

线程安全:

显然,当有多个线程访问时,访问必须序列化,当有一个线程访问时,其他线程必须等待。

使用QMutex保护数据的访问。

class Counter
{
public:Counter() { n = 0; }void increment() { QMutexLocker locker(&mutex); ++n; }void decrement() { QMutexLocker locker(&mutex); --n; }int value() const { QMutexLocker locker(&mutex); return n; }private:mutable QMutex mutex;int n;
};

在构造函数中自动锁定互斥锁,在函数结束时调用析构函数时解锁互斥锁,锁定互斥锁可确保序列化来自不同线程的访问。数据成员mutex是用限定符mutable声明的,因为我们需要锁定和解锁 value()中的互斥锁,因为这是一个 const 函数。

参考文档:

Reentrancy and Thread-Safety | Qt 5.15

http://www.lryc.cn/news/2621.html

相关文章:

  • MySQL数据库06——条件查询(WHERE)
  • Lesson 6.5 机器学习调参基础理论与网格搜索
  • leetcode: Two Sum
  • 共享模型之无锁(三)
  • 微信小程序 Springboot校运会高校运动会管理系统
  • 走进独自开,带你轻松干副业
  • SpringBoot+Vue实现师生健康信息管理系统
  • 数据库第四章节第三次作业内容
  • 一篇五分生信临床模型预测文章代码复现——FIgure 9.列线图构建,ROC分析,DCA分析 (四)
  • 神经网络实战--使用迁移学习完成猫狗分类
  • Attention机制 学习笔记
  • 数据类型与运算符
  • 算法刷题-二叉树的锯齿形层序遍历、用栈实现队列 栈设计、买卖股票的最佳时机 IV
  • 华为OD机试 - 最小传递延迟(Python)| 代码编写思路+核心知识点
  • 集中供热调度系统天然气仪表内网仪表图像识别案例
  • 笔试题-2023-复旦微-数字IC设计【纯净题目版】
  • 【Linux】冯诺依曼体系结构和操作系统概念
  • HTML5之HTML基础学习笔记
  • FreeRTOS信号量 | FreeRTOS十
  • 【SpringBoot】SpringBoot常用注解
  • 数据一致性
  • Docker不做虚拟化内核,对.NET有什么影响?
  • HTML总结
  • ByteHouse:基于ClickHouse的实时数仓能力升级解读
  • [SSD固态硬盘技术 15] FTL映射表的神秘面纱
  • 浅析依赖注入框架的生命周期(以 InversifyJS 为例)
  • HER2靶向药物研发进展-销售数据-上市药品前景分析
  • 【第38天】不同路径数问题 | 网格 dp 入门
  • LINUX之链接命令
  • 1628_MIT 6.828 xv6_chapter0操作系统接口