你觉得好的代码可能并不是最优的解决方案

晚上我看到了JeffXie 写了一篇关于内存屏障的文章,后面又看到Linus对一次内存屏障修改的建议,所以就有了这篇文章。

https://mp.weixin.qq.com/s/H7Pw8xCKcNu41UGaYB648w

在我看来,内存屏障谁为了让计算机做更加正确的事情,不希望计算机对计算进行排序导致结果不符合预期。

1189418272966bfc605ec1eacb345421.png

因为是多核计算机,所以会对上面的计算进行指令排序,说指令排序可能觉得拗口,可以认为多核计算的顺序是随机的,随机的执行就会导致随机的结果。

随机的执行结果肯定不符合我们的预期。

—— 所以就出现了内存屏障

内存屏障如果理解简单一些,可以认为是写优先,读次之,因为是对同一片内存「同一个变量」操作。

加了内存屏障的标志,多个cpu之间互相可见,比如cpu1要对变量a操作,如果加了内存屏障其他cpu也会看到cpu1的这个执行指令,就会先等cpu1完成后再去读。

f0a2645efa77cd57ada643b032fdfcba.png

最近的一个关于内存屏障的提交,被Linus驳回重写

提交的理由和代码修改如下

Mikulas是这部分的代码的修改提交,他首先提出了自己的疑问,在wait_on_bit这个函数里面加上内存屏障是否合适?

他觉得应该加上内存屏障的原因是因为这个函数在其他地方要调用,在一些weak memory ordering架构上,这个函数有可能返回无效的值。

关于weak memory ordering 我认为是对指令的一种排序,如果在排序不恰当的架构上,就有可能引起问题。

之后就是

ed0a51af11cbfc6fdd353613a87b084a.png

之后就是Linus的建议

首先这是一个基础的接口函数,这个问题在x86上是没有问题的。

之后又说明了内存屏障是不能轻易使用的,要正确的使用它,你为什么还视图提交这方面的comments。

b05ca5cd08467da1dae08464dbc59949.png

其中提到的修改建议最后被使用在最新的内核代码中,就是重新写一个test_bit_acquire()函数。

而新的函数里面有一个函数是 smp_load_acquire(),这个函数我查了很多资料,最后我自己的理解是,获取这个地址是否有在被其他cpu写,如果没有,就表示当前的cpu可以使用这个地址的值。

可以认为是内存屏障更加精细的函数操作。

9d899883b9e9538c916b0f256a0ee3cc.png

——最后的修改如下

c3f98287ec7a309e921990d867279654.png

695feb17b2aa6cb94c171f36aed19919.png

关于如何正确只用内存屏障,下面的文章会非常适合大家

https://mp.weixin.qq.com/s/d8UwmHzTxKICN3HvGnbdHQ

参考:

https://lkml.org/lkml/2022/8/25/1225

https://www.kernel.org/doc/Documentation/memory-barriers.txt

http://vh21.github.io/linux/2015/04/25/linux-barrier-api.html

63aa2939ccdc7ed2cc0b7c66f1d65056.jpeg

56831ed2c1e57eddc67b62dc634c95aa.gif

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

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

相关文章

MinGW与MSVC编译的区别

本人使用的是QT5.6,当时我们选择下载的是第一个VS2015版本,也就是通过MSVC方式编译。 我们来对比一下这两个编译器的区别: MSVC是指微软的VC编译器MinGW是指是Minimalist GNU on Windows的缩写。它是一个可自由使用和自由发布的Windows特定头…

dos2unix整个目录

因为经常在windos平台和linux平台之间协同开发,所以不可避免的就碰到了CRLF的问题,dos2unix 和 unix2dos可以说是最常用的解决CRLF问题的工具了。下面列出怎么对整个目录中的问题做dos2unix操作$ find . -type f -exec dos2unix {} \; 其中具体命令的解释…

使用DNS 轻松获取主机信息

利用dns类和WMI规范获取IP及MAC地址 在C#编程中,要获取主机名和主机IP地址,是比较容易的.它提供的Dns类,可以轻松的取得主机名和IP地址. 示例: string strHostName Dns.GetHostName(); //得到本机的主机名 IPHostEntry ipEntry Dns.GetHostByName(strHostName); //取得…

unix高级环境编程-基础知识

对于一个从C#转向Linux/unix系统开发的菜鸟,中间无数次的焦头烂额只有自己心理明白,所幸我没有在大风大浪中凋零破碎,依然坚挺着我的学习之路。 Unix操作系统结构: UNIX ,是一个强大的多用户、多任务操作系统&#xff…

oh,我这个大佬盆友教我整机器学习

这个项目是我一个盆友的毕业设计,他的设计在这项目基础上新增了功能,晚上我们在这部分讨论了很久,在机器学习领域这个项目不算高深,但对于我们初学者,想了解机器学习是个什么鬼东西的我们来说帮助很大。https://github…

MailMail升级到1.0.2.4

修正一处会导致异常的逻辑错误 手动添加收件人地址时,如果地址已存在,将获得提示。 增加收件人地址导入功能,可以从一个或多个文件中导入收件人地址。 增加收件人列表导出功能 为避免干扰滚动条的使用,双击打开添加附件对话框的功…

QT事件的接受与忽略

转载:http://blog.csdn.net/gusgao/article/details/48862391 首先来看一段代码: //!!! Qt5 // ---------- custombutton.h ---------- // class CustomButton : public QPushButton {Q_OBJECT public:CustomButton(QWidget *parent 0); private:void…

导师问我打开句柄fd和没有打开的差异在哪里?

大家好昨晚看到一个同学在群里提问,想简单回答这个问题,我的答案可能不是最全面的,文章最后的两篇技术文大家可以看看,大家也可以说下自己的看法。fd的发明我觉得是计算机的一个壮举,因为对于应用程序来说,…

.net数据绑定控件中的数据导出到Excel

在做审计局内部系统时&#xff0c;数据需要导出到Excel&#xff0c;在网上找了些代码&#xff0c;成功的完成了此功能 在html代码第一行中添加EnableEventValidation"false" <% Page Language"C#" AutoEventWireup"true" EnableEventValidat…

汇编调用c函数为什么要设置栈

一.栈的整体作用 (1)保存现场/上下文 (2)传递参数:汇编代码调用c函数时&#xff0c;需传递参数 (3)保存临时变量:包括函数的非静态局部变量以及编译器自动生成的其他临时变量。 二.为什么汇编代码调用c函数需要设置栈 之前看了很多关于uboot的分析&#xff0c;其中就有说要为C语…

C++之Boost准标准库配置

下载安装 进入官网下载地址&#xff1a;https://www.boost.org/users/download/ 本教程直接下载官方已编译库&#xff0c;不涉及源代码手动编译 点击官方编号好的链接&#xff0c;然后进入一个下载地址&#xff1a;https://sourceforge.net/projects/boost/files/boost-binarie…

给.net初学者的一些建议(共勉之)[转载]

.不要以为.net就需要把代码全部写到.cs页面,不屑于使用vs提供的方便的控件操作. .不要以为.net就是把各种控件往页面上一拖,然后通过vs方便的设置一下就ok. .不要以为.net就需要在一开始从编译原理到web服务各种各样的书都看上一遍 .不要以为.net就是直接打开vs建立页面然后闷头…

大小端模式 续

union w { int a; char x[2]; }e; e.x[0]10; e.x[1]1; cout<<e.a<<endl; 那么运算结果在little-endian模式中的结果为266,那么原因是什么呢 我个人的理解 小端模式下&#xff1a; printf("0x%x", e.a); 结果为0x10a 大端模式下&#xff1a; printf("…

利用HTML中的XML数据岛记录浏览

html文件&#xff1a;shop.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml"> <head> <me…

1.5

C Concurrency in Action Anthony Williams Chapter 1. Hello, world of concurrency in C! 1.1 What is concurrency? 1.1.1 Concurrency in computer systems 1.1.2 Approaches to concurrency 1.2 Why use concurrency? 1.2.1 Using concurrency for separation of concer…

测试一下你对IP地址的掌握水平(网管面试时会用到)

以下内容摘自《网管员面试宝典》一书。测试一下你对IP地址的理解能力&#xff0c;大家先不看题后的解答&#xff0c;看自己能做出多少题。网管面试时会用到的。面试题1&#xff1a;以下说法正确的是&#xff08; &#xff09;。A. C类地址就是局域网用的IP地址 B. A类地址的网…

中秋的秋

又是一年中秋中秋是比较特别的节日&#xff0c;因为每一年的中秋&#xff0c;我和小云总是能遇到各种事情而分开「当然今年不会」。去年的时候&#xff0c;我们因为要赶项目&#xff0c;所以中秋申请了加班&#xff0c;要申请加班的那天我还是挺不情愿的&#xff0c;然后旁边的…

OpenSSL原理与实现

1. 概念 1.1. SSL&#xff08;Secure Sockets Layer安全层套接字&#xff09;/TLS&#xff08;Transport Layer Security传输层套接字&#xff09;。 最常见的应用是在网站安全方面&#xff0c;用于http数据传输的加密。 1.2. 安全的目标&#xff1a;保密性&#xff08;confide…

shell的debug模式

如何调试shell脚本&#xff1f; 在指定shell运行版本时加上 -x #!/bin/bash -x ➜ demo git:(master) ✗ cat debug.sh #!/bin/bash -xecho "hi" date sleep 1 echo "hi" date调试结果&#xff1a; ➜ demo git:(master) ✗ ./debug.sh echo hi hidat…

C++ 重载(overload)、重写(overrride)、重定义(redefine)总结

昨晚打开论坛&#xff0c;看到有朋友问了一个关于虚函数的问题&#xff0c;因为头太疼了&#xff0c;所以今天中午起床再看。 问题传送门&#xff1a;http://www.cppleyuan.com/viewthread.php?tid7923 C的一些特性好久没使用了&#xff0c;导致有些生疏了&#xff0c;所以查了…