线程安全与可重入函数

 以下是一个简单的线程不安全函数的示例,以及如何通过加锁机制将其变为线程安全的函数:

#include <stdio.h>  
#include <pthread.h>  int val = 0;  
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;  void* routine(void* arg) {  int i = 0;  while (i < 400) {  // 加锁  pthread_mutex_lock(&lock);  int tmp = val;  printf("thread is %u; val is: %d\n", pthread_self(), val);  val = tmp + 1;  // 解锁  pthread_mutex_unlock(&lock);  i++;  }  return NULL;  
}  int main() {  pthread_t a1, a2;  pthread_create(&a1, NULL, routine, NULL);  pthread_create(&a2, NULL, routine, NULL);  pthread_join(a1, NULL);  pthread_join(a2, NULL);  return 0;  
}

在上面的示例中,val是一个全局变量,被两个线程共享。原始的代码是线程不安全的,因为两个线程可能会同时访问和修改val,导致数据不一致。通过添加互斥锁(pthread_mutex_lockpthread_mutex_unlock),可以确保在某一时刻只有一个线程能够访问和修改val,从而使函数变为线程安全的。 

一、定义

如果一个函数在同一时刻可以被多个线程安全地调用,即函数被多个并发线程反复调用时,它会一直产生正确的结果,那么这个函数就被称为线程安全的。

二、实现方法

  1. 局部变量:在C语言中,局部变量是在栈中分配的,任何未使用静态数据或其他共享资源的函数都是线程安全的。
  2. 加锁机制:对于使用全局变量或静态数据的函数,由于这些数据是共享的,因此需要通过加锁的方式来使函数实现线程安全。加锁可以确保在某一时刻只有一个线程能够访问共享数据,从而避免数据冲突。
  3. 线程局部存储:将变量本地化,以便每个线程都有自己的私有数据。这些变量跨子例程和其他代码边界保留它们的值,并且是线程安全的,因为它们对于每个线程都是本地的。
  4. 不可变对象:对象的状态在构造后无法更改,这意味着仅共享只读数据和获得固有的线程安全性。

三、特性

  1. 数据一致性:线程安全的函数能够确保多个线程在访问共享数据时不会造成数据不一致或数据污染。
  2. 无竞争条件:线程安全的函数通常还包括防止或限制不同形式竞争条件风险的设计步骤。
  3. 优化并发性能:线程安全的设计通常会考虑最大化并发性能,尽管有时不能完全提供无死锁保证。

四、与可重入性的关系

  1. 可重入函数:可以在任意时刻被中断,稍后再继续运行而不会丢失数据的函数。可重入性解决函数运行结果的确定性和可重复性。

  2. 区别与联系

    • 一个函数对于多个线程是可重入的,则这个函数是线程安全的。
    • 一个函数是线程安全的,但并不一定是可重入的。可重入性要强于线程安全性。
    • 可重入函数是线程安全函数的一个真子集。也就是说,如果函数是可重入的,就可以保证它是线程安全的,但有些不可重入的函数也可能是线程安全的(如系统库函数)。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/443256.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【分立元件】案例:电感焊盘部分发黑原因有什么?

大家都知道正常的一体成型电感的PIN脚外观如下图所示: 其中要求对电极的验收要求可能有几个关注点,如:电极偏位、划痕、凸起、生锈、孔洞等。 但是在工作过程中,前段时间,有同事咨询电感来料焊盘存在发黑现象的原因是什么。 对于这方面其实我也不懂,但通…

通信工程学习:什么是RIP路由信息协议

RIP&#xff1a;路由信息协议 RIP&#xff08;Routing Information Protocol&#xff09;路由信息协议是一种基于距离矢量算法的内部网关协议&#xff08;IGP&#xff09;&#xff0c;主要用于在自治系统&#xff08;AS&#xff09;内部进行路由信息的交换和传播。以下是关于RI…

Base64字符串转图片在线工具

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 基本原理 Base64编码&#xff0c;作为一种将二进制数据转换为文本格式的方法&#xff0c;其核心在于利用64个可打印字符来表征任意的二进制信息。这一编码方式的出现&#…

一些零散的和编译相关的语法/flash-attn涉及语法扫盲

#pragma once&#xff1a;一个编译指令&#xff0c;用于防止头文件被多次包含。当编译器遇到#pragma once时&#xff0c;它会确保该头文件在一个编译单元&#xff08;一个.cpp文件及其包含的所有文件&#xff09;中只会被包含一次。即使该文件被间接包含多次&#xff0c;编译器…

用于图像识别的判别图正则化技术

本文所涉及所有资源均在 传知代码平台 可获取。 目录 论文概述 图正则化技术及其优点 算法流程 在标准BLS中嵌入判别图正则化的方法 模型整体架构 代码复现 图拉普拉斯矩阵的构建——generateLmatrix.py文件 复现模型整体架构——bls2deep_graph.py文件 顶层文件——GBLS.py文件…

Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND

Case1 : 表没有主键 show create table xxx desc table Case2 : 表是MEMORY表 show create table xxx desc table https://dev.mysql.com/doc/mysql-replication-excerpt/5.7/en/replication-features-memory.html

KDTS 实现MySQL至KingbaseES迁移实践

此文章以linux环境实践&#xff0c;KingbaseES一下使用KES代替。 KDTS KDTS工具安装KES时会一起安装&#xff0c;一般存在目录为&#xff1a;ClientTools目录下guitools文件夹中 启动 进入KDTS-WEB下bin目录&#xff0c;执行sh文件 cd /opt/Kingbase/ES/V8/ClientTools/guit…

70.【C语言】动态内存管理(重点)(3)

本文为数据结构打下基础 备注:数据结构需要掌握指针,结构体和动态内存管理 承接69.【C语言】动态内存管理(重点)(2)文章 目录 4.calloc函数 cplusplus网的翻译 提炼要点 使用 5.recalloc函数 使用说明 作用 调整内存空间的几种情况 1.原有空间之后有足够大的空间 …

自动猫砂盆是养猫新型智商税吗?测评2024年热门款智能猫砂盆分享

铲屎官们只要一察觉到猫主子拉屎&#xff0c;就要马上去铲掉&#xff0c;这不仅是为了猫砂盆中其他干净的猫砂&#xff0c;更是为了防止猫屎残留发臭&#xff0c;特别是便便这种东西&#xff0c;一旦放久了就很招虫子&#xff0c;家里出现这些虫子又要大扫除消杀&#xff0c;特…

使用Python接口自动化测试post请求和get请求,获取请求返回值

引言 我们在做python接口自动化测试时&#xff0c;接口的请求方法有get,post等&#xff1b;get和post请求传参&#xff0c;和获取接口响应数据的方法&#xff1b; 请求接口为Post时&#xff0c;传参方法 我们在使用python中requests库做接口测试时&#xff0c;在做post接口测试…

论文精读:基于概率教师学习的跨域自适应目标检测(ICML2022)

原文标题&#xff1a;Learning Domain Adaptive Object Detection with Probabilistic Teacher 中文标题&#xff1a;基于概率教师学习的域自适应目标检测 代码地址&#xff1a; GitHub - hikvision-research/ProbabilisticTeacher: An official implementation of ICML 2022 p…

计算机网络——ftp

在网络通信中&#xff0c;控制连接和数据连接是两种不同类型的连接&#xff0c;它们各自具有特定的功能和用途。 一、控制连接 定义与功能&#xff1a; 控制连接主要用于在通信双方之间传输控制信息&#xff0c;以建立、维护和终止数据连接。它负责协调和管理数据传输的过程&am…

图像数据增强库综述:10个强大图像增强工具对比与分析

在深度学习和计算机视觉领域&#xff0c;数据增强已成为提高模型性能和泛化能力的关键技术。本文旨在全面介绍当前广泛使用的图像数据增强库&#xff0c;分析其特点和适用场景&#xff0c;以辅助研究人员和开发者选择最适合其需求的工具。 数据增强的重要性 数据增强在深度学习…

架构设计笔记-7-系统架构设计基础知识

目录 知识要点 单选 案例分析 1.质量属性 / 管道过滤器 / 数据仓库风格 2.面向对象风格 / 控制环路风格 3.软件架构风格 / 架构风格选择 4.体系结构方案对比 5.面向对象风格 / 基于规则风格 6.解释器风格 / 管道过滤器风格 7.面向对象风格 / 解释器风格 8.软件架构复…

直击工博会 | 万物集与四大供应商强强联手,开启战略合作新纪元!

9月24日&#xff0c;第24届中国国际工业博览会在国家会展中心&#xff08;上海&#xff09;开幕。本届工博会设置数控机床与金属加工展、工业自动化展、节能与工业配套展、新一代信息技术与应用展等9大专业主题展&#xff0c;吸引28个国家和地区2600家企业参展。万物集作为参展…

Canal 扩展篇(阿里开源用于数据同步备份,监控表和表字段(日志))

1.Canal介绍 Canal把自己伪装成从数据库&#xff0c;获取mysql主数据库的日志&#xff08;binlog&#xff09;信息&#xff0c;所以要想使用canal就得先开启数据库日志 https://github.com/alibaba/canal Canal 主要用途是基于 MySQL 数据库增量日志解析&#xff0c;提供增量…

影刀RPA在智能客服上的运用

随着人工智能技术的不断发展&#xff0c;智能客服系统逐渐成为企业提升服务效率和质量的重要工具。影刀RPA&#xff08;Robotic Process Automation&#xff0c;机器人流程自动化&#xff09;作为一种模拟人类用户行为的技术&#xff0c;通过自动化执行重复性高、规则明确的任务…

1. Oracle 安装报错——环境变量过长

文章目录 1. 报错详细信息2. 解决方案2.1 方案一&#xff1a;修改配置文件cvu_prereq.xml2.2 方案二&#xff1a;修改环境变量配置 1. 报错详细信息 安装 Oracle 过程中&#xff0c;在执行 “先决条件检查” 时报错&#xff1a; 报错内容&#xff1a; This test checks wheth…

163页PPT罗兰贝格品牌战略升级:华为案例启示与电器集团转型之路

罗兰贝格作为一家全球顶级的战略管理咨询公司&#xff0c;其品牌战略升级理念在多个行业中得到了广泛应用。以下将以华为案例为启示&#xff0c;探讨电器集团的转型之路&#xff0c;并融入罗兰贝格品牌战略升级的思想。 一、华为案例的启示 华为与罗兰贝格联合撰写的《数据存…

MySQL【知识改变命运】03

表的基本操作 1&#xff1a;查看所有表2&#xff1a;创建表3&#xff1a;查看表结构4&#xff1a;修改表5&#xff1a; 删除表 前言&#xff1a;我们先了解一个知识&#xff1a; MySQL安装后会有MySQL服务——管理多个库——每个库管理多个表——每个表管理多行数据——数据行由…