linux无锁化的实例详解

linux支持的哪些操作是具有原子特性的?知道这些东西是理解和设计无锁化编程算法的基础。

下面的东西整理自网络。先感谢大家的分享!

sync_fetch_and_add系列的命令,发现这个系列命令讲的最好的一篇文章,英文好的同学可以直接去看原文。Multithreaded simple data type access and atomic variables

sync_fetch_and_add系列一共有十二个函数,有加/减/与/或/异或/等函数的原子性操作函数,sync_fetch_and_add,顾名思义,先fetch,然后自加,返回的是自加以前的值。以count = 4为例,调用sync_fetch_and_add(&count,1),之后,返回值是4,然后,count变成了5.
有sync_fetch_and_add,自然也就有sync_add_and_fetch,呵呵这个的意思就很清楚了,先自加,在返回。他们哥俩的关系与i++和++i的关系是一样的。被谭浩强他老人家收过保护费的都会清楚了。
有了这个宝贝函数,我们就有新的解决办法了。对于多线程对全局变量进行自加,我们就再也不用理线程锁了。下面这行代码,和上面被pthread_mutex保护的那行代码作用是一样的,而且也是线程安全的。

sync_fetch_and_add( &global_int, 1 );
下面是这群函数的全家福,大家看名字就知道是这些函数是干啥的了。

在用gcc编译的时候要加上选项 -march=i686

// sam:在我的服务器上,发现不加都可以。type sync_fetch_and_add (type *ptr, type value);type sync_fetch_and_sub (type *ptr, type value);type sync_fetch_and_or (type *ptr, type value);type sync_fetch_and_and (type *ptr, type value);type sync_fetch_and_xor (type *ptr, type value);type sync_fetch_and_nand (type *ptr, type value);type sync_add_and_fetch (type *ptr, type value);type sync_sub_and_fetch (type *ptr, type value);type sync_or_and_fetch (type *ptr, type value);type sync_and_and_fetch (type *ptr, type value);type sync_xor_and_fetch (type *ptr, type value);type sync_nand_and_fetch (type *ptr, type value);

ViiTor实时翻译 ViiTor实时翻译

AI实时多语言翻译专家!强大的语音识别、AR翻译功能。

ViiTor实时翻译 116 查看详情 ViiTor实时翻译

// sam:很纳闷为什么后边要写省略号,是不是还有不需要我们关心的参数?用的时候不需要传参数?下面这两个函数正是哥想要的啦,可以轻松实现互斥锁的功能。

bool sync_bool_compare_and_swap (type*ptr, type oldval, type newval, …)
type sync_val_compare_and_swap (type *ptr, type oldval,  type newval, …)
这两个函数提供原子的比较和交换,如果*ptr == oldval,就将newval写入*ptr,
第一个函数在相等并写入的情况下返回true.
第二个函数在返回操作之前的值。

sync_synchronize (…)

理解上面这个东西,参照:blog.sunchangming.com/post/47188394133
还有两个函数:
type sync_lock_test_and_set (type *ptr, type value, …)
将*ptr设为value并返回*ptr操作之前的值。
void sync_lock_release (type *ptr, …)
将*ptr置0

以上就是linux无锁化的实例详解的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/288272.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
碧蓝航线泽UR吾妻新皮肤-碧蓝航线UR吾妻新皮肤怎么获取
上一篇 2026年10月20日 08:39:01
多个数组中查找至少在两个数组中都存在的交集元素
下一篇 2025年12月20日 19:15:16

相关推荐

  • linux可用更新源

    Kali 2.0更新源kali-rolling:#中科大deb  kali-rolling main non-free contribdeb-src  kali-rolling main non-free contrib #阿里云#deb  kali-rolling main non-free co…

    用户投稿 2026年10月20日
    200
  • (一)在Linux上安装和编译OpenCV3.0.0

    (一)在Linux上安装和编译OpenCV3.0.0(一)在Linux上安装和编译OpenCV3.0.0(一)在Linux上安装和编译OpenCV3.0.0(一)在Linux上安装和编译OpenCV3.0.0

        opencv的全称是:open source computer vision library。opencv是一个基于(开源)发行的跨平台计算机视觉库,可以运行在linux、windows和mac os操作系统上。它轻量级而且高效——由一系列c函数和少量c++ 类构成,同时提供了python、…

    2026年10月20日 • 用户投稿
    100
  • 在VSCode中配置Swift开发环境

    在VSCode中配置Swift开发环境在VSCode中配置Swift开发环境在VSCode中配置Swift开发环境在VSCode中配置Swift开发环境

    首先安装 Swift 工具链并验证版本,接着安装 sourcekit-lsp 语言服务器,然后在 VSCode 中安装 Swift 插件并配置 sourcekit-lsp 路径,最后通过 Swift Package Manager 创建项目并配置调试支持,即可实现完整开发功能。 要在 VSCode …

    2026年10月20日 • 用户投稿
    100
  • Windows安装时选择哪个分区作为系统盘

    Windows安装时选择哪个分区作为系统盘Windows安装时选择哪个分区作为系统盘Windows安装时选择哪个分区作为系统盘Windows安装时选择哪个分区作为系统盘

    选择系统盘需根据硬盘配置和需求决定:单硬盘时选主分区并分配足够空间;多硬盘优先选SSD;双系统则选空闲分区;注意分区格式与数据备份。 在安装Windows操作系统时,选择哪个分区作为系统盘取决于你的硬盘配置、使用需求以及是否已有其他系统存在。以下是几种常见情况和建议: 1. 单硬盘新装系统 如果你的…

    2026年10月20日 • 用户投稿
    100
  • [20170705]理解linux su命令.txt

    [20170705]理解linux su命令.txt –//我一般在维护时经常使用root用户登录,然后su – oracle 转到其他用户操作–//一般都加入 – 参数.这个已经成了条件反射…^_^. # man su       cha…

    2026年10月20日
    200
  • OneDrive如何在Linux上使用_OneDrive在Linux系统配置方法

    OneDrive如何在Linux上使用_OneDrive在Linux系统配置方法OneDrive如何在Linux上使用_OneDrive在Linux系统配置方法OneDrive如何在Linux上使用_OneDrive在Linux系统配置方法OneDrive如何在Linux上使用_OneDrive在Linux系统配置方法

    答案:通过PPA或Snap安装OneDrive客户端,在Ubuntu 24.04上配置账户授权、同步目录及忽略规则,并启用systemd用户服务实现后台自动同步。 如果您希望在Linux系统中同步和管理OneDrive云端文件,但系统原生不支持OneDrive客户端,则可以通过开源工具实现完整的同步…

    2026年10月20日 • 用户投稿
    100
  • Linux上有哪些命令行快捷键

    Ctrl+a:光标移到行首。 Ctrl+e:光标移到行尾。 Ctrl+l:清除终端。该快捷操作与在命令行键入clear作用相同。 Ctrl+d:删除光标后一个字符; Ctrl+u:清除当前行。假如在命令行下工作,使用这一快捷操作可以清除从光标处到行首的字符。 Ctrl+Alt+功能键之一会显示一个新…

    用户投稿 2026年10月20日
    200
  • 如何在Linux中使用update-alternatives管理JDK

    如何在Linux中使用update-alternatives管理JDK如何在Linux中使用update-alternatives管理JDK如何在Linux中使用update-alternatives管理JDK如何在Linux中使用update-alternatives管理JDK

    使用update-alternatives可管理多JDK版本,1.查看配置状态,2.添加JDK路径并设置优先级,3.交互式切换版本,4.验证java -version,实现灵活切换。 在Linux系统中,当需要在同一台机器上安装多个JDK版本并灵活切换时,update-alternatives 是一…

    2026年10月20日 • 用户投稿
    100
  • 使用VSCode内置终端提升开发效率

    使用VSCode内置终端提升开发效率使用VSCode内置终端提升开发效率使用VSCode内置终端提升开发效率使用VSCode内置终端提升开发效率

    VSCode内置终端整合命令行,提升开发效率。1. 用Ctrl+快速开关终端,Ctrl+Shift+新建实例,Ctrl+方向键切换标签;2. 在设置中配置默认shell,支持PowerShell、bash、zsh、cmd及WSL;3. 通过分屏功能并行运行多个命令,如左侧启动服务右侧执行构建;4. …

    2026年10月20日 • 用户投稿
    200
  • 怎么看 linux 是否安装了 mysql

    怎么看 linux 是否安装了 mysql怎么看 linux 是否安装了 mysql怎么看 linux 是否安装了 mysql怎么看 linux 是否安装了 mysql

    查看linux是否安装mysql的方法:1、打开终端命令窗口;2、执行命令“service mysqld start”或者“chkconfig –list mysqld”命令即可。 本文操作环境:linux5.9.8系统、mysql5.5、DELL G3电脑 怎么看 linux 是否安装…

    2026年10月20日 • 用户投稿
    300
  • linux的相关命令介绍

            最近都在和linux打交道,这方面基础比较薄弱的我只好买了本鸟哥的书看看,感觉还不错。我觉得linux相比windows比较麻烦的就是很多东西都要用命令来控制,当然,这也是很多人喜欢linux的原因,比较短小但却功能强大。为了方便大家查找linux的相关命令,我就将我了解到的命令列举…

    2026年10月20日
    100
  • 在Java中如何使用命令行运行Java程序_Java命令行开发方法分享

    在Java中如何使用命令行运行Java程序_Java命令行开发方法分享在Java中如何使用命令行运行Java程序_Java命令行开发方法分享在Java中如何使用命令行运行Java程序_Java命令行开发方法分享在Java中如何使用命令行运行Java程序_Java命令行开发方法分享

    首先编译Java源文件生成class文件,再通过java命令运行;若含包结构需按目录存放并使用完整类名执行;可传递参数给main方法,并用-cp指定类路径加载外部依赖。 在Java中使用命令行运行程序是开发中的基础技能,尤其适用于学习、调试和轻量级项目。掌握命令行操作能帮助你更深入理解Java编译与…

    2026年10月20日 • 用户投稿
    000
  • LINUX怎么使用tcpdump抓取网络包_Linux Tcpdump抓取网络包方法

    LINUX怎么使用tcpdump抓取网络包_Linux Tcpdump抓取网络包方法LINUX怎么使用tcpdump抓取网络包_Linux Tcpdump抓取网络包方法LINUX怎么使用tcpdump抓取网络包_Linux Tcpdump抓取网络包方法LINUX怎么使用tcpdump抓取网络包_Linux Tcpdump抓取网络包方法

    tcpdump是Linux下强大的命令行抓包工具,可用于分析网络通信问题。首先通过sudo apt install tcpdump安装,使用tcpdump -i any -D查看可用接口。基本抓包命令为sudo tcpdump -i eth0,可实时显示数据包信息,按Ctrl+C停止并生成统计。为避…

    2026年10月20日 • 用户投稿
    100
  • 在VSCode中配置Rust开发环境

    在VSCode中配置Rust开发环境在VSCode中配置Rust开发环境在VSCode中配置Rust开发环境在VSCode中配置Rust开发环境

    首先安装Rust工具链并配置VSCode插件。Windows用户下载rustup-init.exe,macOS/Linux用户用curl命令安装,完成后验证rustc和cargo版本;接着在VSCode中安装Rust Analyzer、CodeLLDB等插件;然后用cargo new创建项目,在VS…

    2026年10月20日 • 用户投稿
    000
  • 视频发布:十、部署(下) Linux与Azure

    %ign%ignore_a_1%re_a_1%tps://www.bilibili.com/video/av58096866/?p=10 以上就是视频发布:十、部署(下) Linux与Azure的详细内容,更多请关注创想鸟其它相关文章!

    2026年10月20日
    000
  • 如何在VSCode中配置PHP开发环境

    如何在VSCode中配置PHP开发环境如何在VSCode中配置PHP开发环境如何在VSCode中配置PHP开发环境如何在VSCode中配置PHP开发环境

    首先安装PHP并配置系统路径,确保php -v可执行;接着在VSCode中安装PHP Intelephense、PHP Debug等插件;然后配置Xdebug扩展,修改php.ini启用调试功能;最后设置launch.json并使用php -S启动内置服务器进行调试。 要在VSCode中配置PHP开…

    2026年10月20日 • 用户投稿
    000
  • 配置VSCode使用SSH密钥连接远程Git仓库

    配置VSCode使用SSH密钥连接远程Git仓库配置VSCode使用SSH密钥连接远程Git仓库配置VSCode使用SSH密钥连接远程Git仓库配置VSCode使用SSH密钥连接远程Git仓库

    首先生成SSH密钥对并保存至默认路径,接着将公钥添加到Git服务器的SSH设置中,然后通过ssh -T命令测试连接,最后在VSCode中使用SSH地址克隆或修改远程仓库,实现无密码认证。 使用SSH密钥连接远程Git仓库可以避免重复输入用户名和密码,提升开发效率。VSCode结合SSH配置能让你在编…

    2026年10月20日 • 用户投稿
    400
  • 在VSCode中配置Rust开发环境及调试步骤

    在VSCode中配置Rust开发环境及调试步骤在VSCode中配置Rust开发环境及调试步骤在VSCode中配置Rust开发环境及调试步骤在VSCode中配置Rust开发环境及调试步骤

    首先安装Rust工具链并配置环境变量,然后在VSCode中安装rust-analyzer、CodeLLDB等扩展,接着使用Cargo创建项目并生成launch.json文件配置调试参数,最后通过F5启动调试即可实现断点调试功能。 在VSCode中配置Rust开发环境并实现调试功能,主要依赖于几个核心…

    2026年10月19日 • 用户投稿
    600
  • Linux总结一些常见的命令

    查看当前目录: pwd查看文件具体大小: ls -l返回上一级: cd..返回根目录: cd /创建一个隐藏文件 vim .test显示隐藏文件:ls -a编辑文件:1.vim 文件名2.按i进入插入模式3.写完文件之后按esc,再按shift+:键,再输入wq,回车,文件就保存了。查看文件内容: …

    用户投稿 2026年10月19日
    100
  • tomcat和Nginx的服务器部署

    tomcat和Nginx的服务器部署tomcat和Nginx的服务器部署tomcat和Nginx的服务器部署tomcat和Nginx的服务器部署

    一、准备工作   首先你需要一台linux服务器,知道用户名和密码,然后你需要在windows电脑上安装两个可以连上linux服务器的工具,Xshell 5和Xftp 5,安装教程不多说,补图说明如何连上服务器:   xshell连接界面如下,输入好主机ip后点击确定,xshell会弹出窗口输入用户…

    2026年10月19日 • 用户投稿
    300

发表回复

登录后才能评论
关注微信