linux 内核同步互斥技术之原子变量

news2024/11/23 12:20:14

原子变量用来实现对整数的互斥访问,通常用来实现计数器。
例如,我们写一行代码把变量 a 加 1,编译器把代码编译成 3 条汇编指令。
(1)把变量 a 从内存加载到寄存器。
(2)把寄存器的值加 1。
(3)把寄存器的值写回内存。
在单处理器系统中,如果进程 1 和进程 2 都执行把变量 a 加 1 的操作,可能出现下面的执行顺序:

预期结果是处理器 1 和处理器 2 执行完以后变量 a 的值加 2,但是因为在处理器 1 把变量 a 的新值写回内存之前,处理器 2 从内存读取变量 a 的旧值,导致处理器 1 和处理器 2执行完以后变量 a 的值只增加 1。
    原子变量可以解决这种问题,使 3 个操作成为一个原子操作。
    内核定义了 3 种原子变量。
(1)整数原子变量,数据类型是 atomic_t。
include/linux/types.h
typedef struct {
    int counter;
} atomic_t;

(2)长整数原子变量,数据类型是 atomic_long_t。
(3)64 位整数原子变量,数据类型是 atomic64_t。
下面以整数原子变量为例说明使用方法。初始化静态原子变量的方法如下:
atomic_t <name> = ATOMIC_INIT(n);
在运行中动态初始化原子变量的方法如下:
atomic_set(v, i);
把原子变量 v 的值初始化为 i。
常用的原子变量操作函数如下。
(1) atomic_read(v)
读取原子变量 v 的值。
(2) atomic_add_return(i, v)
把原子变量 v 的值加上 i,并且返回新值。
(3) atomic_add(i, v)
把原子变量 v 的值加上 i。
(4) atomic_inc(v)
把原子变量 v 的值加上 1。
(5) int atomic_add_unless(atomic_t *v, int a, int u);
如果原子变量 v 的值不是 u,那么把原子变量 v 的值加上 a,并且返回 1,否则返回 0。
(6) atomic_inc_not_zero(v)
如果原子变量 v 的值不是 0,那么把原子变量 v 的值加上 1,并且返回 1,否则返回 0。
(7) atomic_sub_return(i, v)
把原子变量 v 的值减去 i,并且返回新值。
(8) atomic_sub_and_test(i, v)
把原子变量 v 的值减去 i,测试新值是否为 0,如果为 0,返回真。
(9) atomic_sub(i, v)
把原子变量 v 的值减去 i。
(10) atomic_dec(v)
把原子变量 v 的值减去 1。
(11) atomic_cmpxchg(v, old, new)
执行原子比较交换, 如果原子变量 v 的值等于 old, 那么把原子变量 v 的值设置为 new。返回值总是原子变量 v 的旧值。
 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

smartKettle离线部署及问题记录

目录 &#x1f4da;第一章 前言&#x1f4d7;背景&#x1f4d7;目的&#x1f4d7;总体方向 &#x1f4da;第二章 部署&#x1f4d7;源码下载&#x1f4d7;后端部署&#x1f4d5;导入后端项目&#x1f4d5;修改settings.xml(自动下载相关jar包)&#x1f4d5; 编译&#x1f4d5; …

【计算机网络】TCP|IP协议

目录 前言 什么是TCP/IP协议&#xff1f; TCP/IP协议的层次结构 TCP/IP协议的工作原理 TCP/IP协议的重要性 结语 前言 TCP/IP协议是当今互联网世界中最重要的网络协议之一&#xff0c;它是网络通信的基石&#xff0c;为数据在网络中的传输提供了可靠性和有效性。本文将深…

比较好的python书籍,python有什么书推荐

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;比较好的python书籍&#xff0c;python有什么书推荐&#xff0c;现在让我们一起来看看吧&#xff01; 我是在半年前接触到Python的&#xff0c;我之前没有一点编程基础&#xff0c;但在我自学的这半年里&#xff0c;我发…

Vue指令之v-on

v-on指令用于注册事件&#xff0c;作用是添加监听与提供事件触发后对应的处理函数。 v-on有两种语法&#xff0c;在提供处理函数的时候既可以直接使用内联语句&#xff0c;也可以提供函数的名字。 第一种语法是直接提供内联语句&#xff0c;如下 v-on:事件名 "内联语句…

数据可视化作用探析

数据可视化是一种将数据转化为图表、图形或其他视觉形式的过程&#xff0c;旨在更直观、更易于理解地展示数据信息。它不仅仅是对数据的简单呈现&#xff0c;更是一种利用视觉化手段帮助人们理解数据、发现模式、分析趋势和做出决策的强大工具。今天&#xff0c;我就从可视化从…

RocketMQ可视化工具 打包遇到的yarn intall 问题

文章目录 RocketMQ可视化工具1.github上下载2.修改参数3.运行4.打包5.出错6.解决7.重试8.再解决9.很奇怪运行没错&#xff0c;但是测试错啦10.不想深究&#xff0c;直接跳过测试11.展示成功 RocketMQ可视化工具 1.github上下载 下载地址 https://github.com/apache/rocketmq-…

在Windows 11中打开任务管理器的7种方法,总有一种很适用

​本文介绍了如何在Windows 11中打开任务管理器。使用Windows任务管理器,你可以跟踪系统进程、监视资源使用情况和强制停止应用程序。 如何使用搜索栏打开任务管理器 在Windows 11中访问任务管理器的一种更简单的方法是使用搜索栏。 1、按Windows键+S或选择任务栏中的“搜索…

Nodejs 第二十二章(脚手架)

编写自己的脚手架 那什么是脚手架&#xff1f; 例如:vue-cli Angular CLI Create React App 编写自己的脚手架是指创建一个定制化的工具&#xff0c;用于快速生成项目的基础结构和代码文件&#xff0c;以及提供一些常用的命令和功能。通过编写自己的脚手架&#xff0c;你可以…

值类型相关函数与对象类型相关函数内存调用过程

值类型相关函数内存调用&#xff1a; 先来看这样一段代码&#xff0c;你认为它的运行结果是多少呢&#xff1f; 20和11还是20和10&#xff1f; package org.example;public class Main {public static void main(String[] args) {int a10;add(a);System.out.println(a);}pub…

【INTEL(ALTERA)】Agilex7 FPGA Development Kit DK-DEV-AGI027R1BES编程/烧录/烧写/下载步骤

DK-DEV-AGI027R1BES 的编程步骤&#xff1a; 将外部 USB Blaster II 连接到 J10- 外部 JTAG 接头。将交换机 SW5.3 设置为 ON&#xff08;首次&#xff09;。打开 英特尔 Quartus Prime Pro Edition 软件编程工具。单击 硬件设置 &#xff0c;然后选择 USB Blaster II。将硬件…

Unity_使用FairyGUI搭建登录页面

Unity_使用FairyGUI搭建登录页面 1. 使用FairyGUI准备一个UI界面&#xff0c;例如&#xff1a;以下登录 2. 发布导出&#xff08;发布路径设置为Unity的Asset下任何路径&#xff09; 3. Unity编辑器安装FairyGUI包资源&#xff08;在资源商店找见并存储为我的资源&#xff0c;…

图片怎么去文字水印?分享三个简单无痕方法

图片怎么去文字水印&#xff1f;大家在遇到好看的图片时&#xff0c;是否曾想过将其用作自己的头像&#xff1f;然而&#xff0c;很多时候从网上保存的图片会带有平台或作者的水印&#xff0c;这会严重影响头像的整体视觉效果&#xff0c;导致我们不得不放弃使用这张图片&#…

typename的两种用法

typename有两种用法&#xff0c;第一种用于声明模板时&#xff0c;表示模板类型参数&#xff0c;如下所示。在用于模板声明时&#xff0c;typename 和 class 等价&#xff0c;具有同等含义。 template<typename T> class MyClass; // 等价于 template<class T> cl…

从零开始学机器学习,这些学习网站让你事半功倍!

介绍&#xff1a;机器学习是人工智能&#xff08;AI&#xff09;和计算机科学的一个分支&#xff0c;它专注于使用数据和算法&#xff0c;模仿人类学习的方式&#xff0c;逐步提高自身的准确性。更具体来说&#xff0c;机器学习是一门关于数据学习的科学技术&#xff0c;它能帮…

Postswigger 靶场 XSS 通关

文章目录 PostSwigger靶场XSS通关学徒&#xff1a;第一关学徒&#xff1a;第二关学徒&#xff1a;第三关学徒&#xff1a;第四关学徒&#xff1a;第五关学徒&#xff1a;第六关学徒&#xff1a;第七关学徒&#xff1a;第八关学徒&#xff1a;第九关 PostSwigger靶场XSS通关 靶…

VCSA7.0加入Windows AD域失败的处理过程

一、问题现象 vcsa7.0加入AD域时提示“Idm client exception: Error trying to join AD, error code 2453” 二、处理过程 &#xff08;一&#xff09;检查是否DNS问题 查看dns是否设置正确&#xff0c;如下&#xff1a; 1. Enable SSH on VCSA. 2. Command> shell 3…

高质量渲染效果的硬件要求!云渲染效果的作用优势

​在数字内容创作的世界里&#xff0c;渲染技术始终是提高视觉效果和最终产物质量的关键环节。无论是影视制作、游戏开发还是建筑可视化&#xff0c;高品质的渲染结果对于传达设计理念和吸引观众都至关重要。本文将讨论实现这些高质量渲染效果所需的硬件要求&#xff0c;探讨CP…

程序中关于时间和比较运算符的单词

时间 在日志中&#xff0c;我们经常碰到关于一些时间的单词缩写 比如这个Fri Dec 1 就代表了Friday &#xff08;星期五&#xff09;&#xff0c; December &#xff08;十二月&#xff09; 12月1日星期五 或者使用date查看时间的时候 dateWed Dec 13 05:55:54 PM CST 2023这…

【Hive】——DDL(CREATE TABLE)

1 CREATE TABLE 建表语法 2 Hive 数据类型 2.1 原生数据类型 2.2 复杂数据类型 2.3 Hive 隐式转换 2.4 Hive 显式转换 2.5 注意 3 SerDe机制 3.1 读写文件机制 3.2 SerDe相关语法 3.2.1 指定序列化类&#xff08;ROW FORMAT SERDE ‘’&#xff09; 3.2.2 指定分隔符&#xff0…

Shopee电商平台:跨境电商的领先者

Shopee是一家领先的跨境电商平台&#xff0c;由新加坡互联网公司Sea Group于2015年创立。自成立以来&#xff0c;Shopee凭借其强大的物流网络、安全快捷的收款方式、本地化的客服团队以及丰富的活动资源&#xff0c;赢得了全球用户的喜爱和信赖。本文将全面介绍Shopee的特点和优…