Linux内核中并发与竞争的处理方法之原子操作

这篇具有很好参考价值的文章主要介绍了Linux内核中并发与竞争的处理方法之原子操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.  简介

上一篇文章简单学习了Linux内核提供的原子操作。文章地址如下:

Linux内核中并发与竞争的处理方法之原子操作简介-CSDN博客

本文继续学习Linux内核处理并发与竞争的处理方法之一:原子操作。Linux 内核提供了两组原子操作 API 函数,一组是对整形变量进行操作的,一组是对位进行操作的。

二. Linux内核中并发与竞争的处理方法:原子操作

Linux 内核提供了两组原子操作 API 函数,一组是对整形变量进行操作的,一组是对位进行操作的。我们接下来看一下这些 API 函数。

1.  原子整形操作 API 函数

Linux 内核定义了叫做 atomic_t 的结构体来完成整形数据的原子操作,在使用中用原子变量来代替整形变量,此结构体定义在 include/linux/types.h 文件中,定义如下:

typedef struct {
    int counter;
} atomic_t;

如果要使用原子操作 API 函数,首先要先定义一个 atomic_t 的变量,如下所示:

atomic_t a; //定义 a

也可以在定义原子变量的时候给原子变量赋初值,如下所示:

atomic_t b = ATOMIC_INIT(0); //定义原子变量 b 并赋初值为 0

可以通过宏 ATOMIC_INIT 向原子变量赋初值。

原子变量有了,接下来就是对原子变量进行操作,比如读、写、增加、减少等等,Linux 内核提供了大量的原子操作 API 函数,如下表所示:

Linux内核中并发与竞争的处理方法之原子操作,Linux驱动学习,linux,arm开发

如果使用 64 位的 SOC 的话,就要用到 64 位的原子变量,Linux 内核也定义了 64 位原子结构体,如下所示:

typedef struct {
 long long counter;
} atomic64_t;

相应的也提供了 64 位原子变量的操作 API 函数,这里我们就不详细讲解了,和上表中的 API 函数有用法一样,只是将“atomic_”前缀换为“atomic64_”,将 int 换为 long long。如果使用的是 64 位的 SOC,那么就要使用 64 位的原子操作函数。Cortex-A7 是 32 位的架构,所以本书中只使用上表中的 32 位原子操作函数。

2.  原子位操作 API 函数

位操作也是很常用的操作,Linux 内核也提供了一系列的原子位操作 API 函数,只不过原子位操作不像原子整形变量那样有个 atomic_t 的数据结构,原子位操作是直接对内存进行操作, API 函数如下表所示:

函数 描述

void set_bit(int nr, void *p)

将 p 地址的第 nr 位置 1。

void clear_bit(int nr,void *p)

将 p 地址的第 nr 位清零。

void change_bit(int nr, void *p)

将 p 地址的第 nr 位进行翻转。

int test_bit(int nr, void *p)

获取 p 地址的第 nr 位的值。

int test_and_set_bit(int nr, void *p)

将 p 地址的第 nr 位置 1,并且返回 nr 位原来的值

int test_and_clear_bit(int nr, void *p)

将 p 地址的第 nr 位清零,并且返回 nr 位原来的值。

int test_and_change_bit(int nr, void *p)

将 p 地址的第 nr 位翻转,并且返回 nr 位原来的值。

后面用代码来具体说明原子操作的使用方法。文章来源地址https://www.toymoban.com/news/detail-836393.html

到了这里,关于Linux内核中并发与竞争的处理方法之原子操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第19章 并发与竞争实验(iTOP-RK3568开发板驱动开发指南 )

    瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568 支持安卓 11 和 linux 系统,主要面向物联网

    2024年02月09日
    浏览(48)
  • 并发编程08:原子操作类

    Atomic 翻译成中文是原子的意思。在化学上,我们知道原子是构成一般物质的最小单位,在化学反应中是不可分割的。在我们这里 Atomic 是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。 AtomicInteger :整型原子类 At

    2024年02月04日
    浏览(38)
  • 原子操作:并发编程的守护者

    并发编程的守护者在多线程或者并发编程中,我们经常需要处理一些共享资源,这时候就需要保证这些共享资源的操作是线程安全的。而原子操作就是一种能够保证线程安全的重要手段。本文将详细介绍原子操作的定义、重要性、实现原理以及应用场景。 原子操作可以被视为

    2024年01月16日
    浏览(39)
  • C++并发编程 | 原子操作std::atomic

    目录 1、原子操作std::atomic相关概念 2、不加锁情况 3、加锁情况  4、原子操作 5、总结 原子操作: 更小的代码片段,并且该片段必定是连续执行的,不可分割。 1.1 原子操作std::atomic与互斥量的区别 1) 互斥量 :类模板,保护一段共享代码段,可以是一段代码,也可以是一个

    2023年04月26日
    浏览(36)
  • linux|操作系统|centos7物理机安装网卡驱动8188gu(内核升级,firmware固件,USB设备管理,module管理)

    目前服务器领域centos7基本是主流的操作系统,而linux相对于Windows来说,软硬件方面的支持是差很多的,在硬件方面来说,以一个免驱的网卡为例,window xp可能不会自动识别到,但Windows10基本都会自动识别到,简简单单的即插即用。根本原因在Windows随着版本的升级,内置的各

    2024年01月20日
    浏览(88)
  • 正点原子嵌入式linux驱动开发——Linux CAN驱动

    CAN是目前应用非常广泛的现场总线之一,主要应用于汽车电子和工业领域 ,尤其是汽车领域,汽车上大量的传感器与模块都是通过CAN总线连接起来的。CAN总线目前是自动化领域发展的热点技术之一,由于其高可靠性,CAN总线目前广泛的应用于工业自动化、船舶、汽车、医疗和

    2024年02月06日
    浏览(79)
  • 正点原子嵌入式linux驱动开发——Linux WIFI驱动

    WIFI的使用已经很常见了,手机、平板、汽车等等,虽然可以使用有线网络,但是有时候很多设备存在布线困难的情况,此时WIFI就是一个不错的选择。 正点原子STM32MP1开发板支持USB和SDIO这两种接口的WIFI ,本章就来学习一下如何在STM32MP1开发板上使用USB和SDIO这两种WIFI。 正点原

    2024年02月05日
    浏览(71)
  • 正点原子嵌入式linux驱动开发——Linux 网络设备驱动

    网络驱动是linux里面驱动三巨头之一 ,linux下的网络功能非常强大,嵌入式linux中也常常用到网络功能。前面已经讲过了字符设备驱动和块设备驱动,本章就来学习一下linux里面的 网络设备驱动 。 本次笔记中讨论的都是有线网络! 提起网络,一般想到的硬件就是“网卡”。在

    2024年01月17日
    浏览(71)
  • 正点原子 imx6ull linux 更新内核与设备树 通过nfs挂载

    通过修改linux正点原子imx6ull设备树,防止led灯占用 编译内核与设备树 1.将原子的镜像解压到ubuntu虚拟机 2.使用tar -xf linux…解压到某一文件夹 3.修改设备树文件(imx6ull-alientek-emmc.dts) 在leds下面添加 4.编译设备树 在源码 根目录 下 (非必须)4-2.编译内核 在源码 根目录 下 如果已经

    2024年02月08日
    浏览(42)
  • linux内核网络驱动框架(linux驱动开发篇)

    网络驱动的核心: 1、就是初始化 net_device 结构体中的各个成员变量, 2、然后将初始化完成以后的 net_device 注册到 Linux 内核中 1、网络设备(用net_device结构体) 2、网络设备的操作集( net_device_ops结构体 ) 3、sk_buff结构体 网络是分层的,对于应用层而言不用关系具体的底层是

    2023年04月08日
    浏览(80)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包