`int` 是原子类型吗?

2024-02-24

Quoting gnu https://www.gnu.org/software/libc/manual/html_node/Atomic-Types.html:

实际上,您可以假设 int 是原子的。您还可以假设指针类型是原子的;非常方便。这两个假设在 GNU C 库支持的所有机器上以及我们所知的所有 POSIX 系统上都是成立的。

这怎么可能?我见过的所有与锁相关的例子都是用int计数器,像这样https://www.delftstack.com/howto/c/mutex-in-c/ https://www.delftstack.com/howto/c/mutex-in-c/.


glibc 手册中的这段文字仅与以下内容相关:volatile sig_atomic_t安全线程与其信号处理程序之间。他们保证volatile int在 GNU 系统中也将这样工作。请注意您省略的上下文:

为了避免不确定性打断访问变量时,您可以使用特定的数据类型,该数据类型的访问始终是原子的:sig_atomic_t。保证在一条指令中读取和写入此数据类型,因此无法处理程序在访问的“中间”运行。

这并没有说明原子性。其他线程或并发。中断处理程序接管 CPU 并运行instead你的代码。任何时候都是异步的,但主线程及其信号处理程序不会同时运行(尤其是在不同的 CPU 内核上)。


对于线程来说,原子性是不够的,还需要保证能见度线程之间(你可以从_Atomic int with memory_order_relaxed),有时您可以通过更强的记忆顺序来获得排序。

请参阅前几部分为什么自然对齐变量的整数赋值在 x86 上是原子的? https://stackoverflow.com/questions/36624881/why-is-integer-assignment-on-a-naturally-aligned-variable-atomic-on-x86/36685056#36685056有关为什么 C 类型的宽度在您正在编译的目标上自然是原子的的更多讨论是not足够做任何事情。

有时您还需要 RMW 原子性,例如执行atomic_fetch_add 的能力,这样如果 1000 个这样+=1操作发生在多个线程中,总结果如下+=1000。为此,您绝对需要编译器支持(或内联汇编),例如 C11_Atomic int. num++ 对于“int num”可以是原子的吗? https://stackoverflow.com/questions/39393850/can-num-be-atomic-for-int-num/39396999#39396999

保证int是原子手段atomic_int应该总是无锁的,而且便宜,但这绝对不意味着简单int对于线程之间共享的数据来说是远程安全的。这就是数据竞争 UB,即使您使用像 GNU C 这样的内存屏障asm("" ::: "memory")为了尝试让编译器不将值保留在寄存器中,您的代码可以通过许多有趣的方式进行中断,这些方式比一些明显的中断机制更微妙。看谁害怕一个糟糕的优化编译器? https://lwn.net/Articles/793253/在 LWN 上了解有关在 Linux 内核中执行此操作的一些注意事项,他们在其中使用volatile为了原子性。

(有趣的事实:GNU C 至少事实上提供了纯加载和纯存储原子性volatile int64_t在 64 位机器上,与普通的不同int64_t https://stackoverflow.com/questions/71866535/which-types-on-a-64-bit-computer-are-naturally-atomic-in-gnu-c-and-gnu-c-m/71867102#71867102。 ISO C 甚至不能保证这一点volatile,这就是为什么 Linux 内核依赖于用 GCC 或 clang 编译的原因。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

`int` 是原子类型吗? 的相关文章

  • 具有不同大小结构的结构数组的 malloc()

    如果每个结构都包含一个大小不同的字符串数组 那么如何正确地 malloc 一个结构数组 因此每个结构可能有不同的大小 并且不可能 realloc 结构体数量 sizeof 结构体名称 after malloc 初始大小 sizeof 结构名
  • 分段错误(核心转储)错误

    我的程序编译罚款 但在输入文件时出现 分段错误 核心转储 错误 我没有正确处理 ostream 吗 include
  • C 程序从连接到系统的 USB 设备读取数据

    我正在尝试从连接到系统 USB 端口的 USB 设备 例如随身碟 获取数据 在这里 我可以打开设备文件并读取一些随机原始数据 但我想获取像 minicom teraterm 这样的数据 请让我知道我可以使用哪些方法和库来成功完成此操作以及如
  • System.IO.IOException:由于意外>数据包格式,握手失败?

    有谁知道这意味着什么 System Net WebException 底层连接已关闭 发送时发生意外错误 gt System IO IOException 由于意外 握手失败 数据包格式 在 System Net Security SslS
  • 为什么Apache MPM prefork.c 使用互斥体来保护accept()?

    我坐下来读书Apache 的 MPM prefork c http code metager de source xref apache httpd server mpm prefork prefork c这段代码使用了一个名为accept
  • mprotect 之后 malloc 导致分段错误

    在使用 mprotect 保护内存区域后第一次调用 malloc 时 我遇到分段错误 这是执行内存分配和保护的代码片段 define PAGESIZE 4096 void paalloc int size Allocates and ali
  • 将字符串转换为正确的 URI 格式?

    有没有简单的方法可以将电子邮件地址字符串转换为正确的 URI 格式 Input http mywebsite com validate email 3DE4ED727750215D957F8A1E4B117C38E7250C33 email
  • 从成员函数指针类型生成函子

    我正在尝试简化 通过make fn 预处理参数的函子的生成 通过wrap 对于 arity 的成员函数n 生成函子基本上可以工作 但到目前为止只能通过显式指定成员函数的参数类型来实现 现在我想从它处理的成员函数类型生成正确的函子 struc
  • C# 委托责任链

    为了我的理解目的 我实现了责任链模式 Abstract Base Type public abstract class CustomerServiceDesk protected CustomerServiceDesk nextHandle
  • 使用 WF 的多线程应用程序的错误处理模式?

    我正在写一个又长又详细的问题 但只是放弃了它 转而选择一个更简单的问题 但我在这里找不到答案 应用程序简要说明 我有一个 WPF 应用程序 它生成多个线程 每个线程执行自己的 WF 处理线程和 WF 中的错误 允许用户从 GUI 端进行交互
  • 默认析构函数做了多少事情

    C 类中的默认析构函数是否会自动删除代码中未显式分配的成员 例如 class C public C int arr 100 int main void C myC new C delete myC return 0 删除 myC 会自动释放
  • 从 R 到 C 处理列表并访问它

    我想使用从 R 获得的 C 列表 我意识到这个问题与此非常相似 使用 call 在 R 和 C 之间传递数据帧 https stackoverflow com questions 6658168 passing a data frame f
  • asp.net网格分页的SQL查询

    我在用iBatis and SQLServer 使用偏移量和限制进行分页查询的最佳方法是什么 也许我添加该列ROW NUMBER OVER ORDER BY Id AS RowNum 但这只会阻止简单查询的数据访问 在某些情况下 我使用选择
  • 0-1背包算法

    以下 0 1 背包问题是否可解 浮动 正值和 浮动 权重 可以是正数或负数 背包的 浮动 容量 gt 0 我平均有 这是一个相对简单的二进制程序 我建议用蛮力进行修剪 如果任何时候你超过了允许的重量 你不需要尝试其他物品的组合 你可以丢弃整
  • 使用 HTMLAgilityPack 从节点的子节点中选择所有

    我有以下代码用于获取 html 页面 将网址设置为绝对 然后将链接设置为 rel nofollow 并在新窗口 选项卡中打开 我的问题是关于将属性添加到 a s string url http www mysite com string s
  • 在 C++17 中使用 成员的链接错误

    我在 Ubuntu 16 04 上使用 gcc 7 2 并且需要使用 C 17 中的新文件系统库 尽管确实有一个名为experimental filesystem的库 但我无法使用它的任何成员 例如 当我尝试编译此文件时 include
  • 受限 AppDomain 中的代码访问安全异常

    Goal 我需要在权限非常有限的 AppDomain 中运行一些代码 它不应该访问任何花哨或不安全的内容 except对于我在其他地方定义的一些辅助方法 我做了什么 我正在创建一个具有所需基本权限的沙箱 AppDomain 并创建一个运行代
  • 类中不允许使用不完整类型,但类模板中允许使用不完整类型

    以下为无效代码 struct foo struct bar bar x error field x has incomplete type struct bar int value 42 int main return foo x valu
  • 在 Xamarin 中获取 OutOfMemoryException

    java lang OutOfMemoryError 考虑增加 JavaMaximumHeapSize Java 执行时内存不足 java exe 我的 Visualstudio Xamarin 项目出现内存不足异常 请帮助我如何解决此问题
  • 如何使用 C# 以低分辨率形式提供高分辨率图像

    尝试使用 300dpi tif 图像在网络上显示 目前 当用户上传图像时 我正在动态创建缩略图 如果创建的页面引用宽度为 500x500px 的高分辨率图像 我可以使用相同的功能即时转换为 gif jpg 吗 将创建的 jpg 的即将分辨率

随机推荐

  • 使用 MSBuild 从命令行定义预处理器值[重复]

    这个问题在这里已经有答案了 我需要创建由多个项目组成的现有大型应用程序的演示版本 我想使用现有的项目 并通过预处理器指令中性化功能 if DEMO mycode NeuterNow endif 我们正在使用 MSBuild 构建我们的应用程
  • JSON.NET \ 如何在 Json.net 中连接两个 JSON

    我有两个 JSON 作为简单字符串 有没有巧妙的方法来连接它们 作为基础设施的一部分 string j1 a 1 string j2 b 2 var j JsonConvert SerializeObject new JsonConvert
  • vue bootstrap b-collapse:当侧边栏折叠时,更改margin-left内容div

    我对 Vue Bootstrap b collapse 导航栏 侧边栏 内容 有疑问 https jsfiddle net Lvkjn7he 1 https jsfiddle net Lvkjn7he 1 当点击 navbar toggle
  • cakephp 使用 mysql SQL_CALC_FOUND_ROWS 进行分页

    我试图让 Cakephp 分页利用 mysql 中的 SQL CALC FOUND ROWS 功能来返回总行数 同时使用 LIMIT 希望这可以消除 paginateCount 然后 paginate 的双重查询 http dev mysq
  • 如何合并两个图像

    我有一个单一的图像 我有一个带有横幅图像的集合视图 现在 我需要将这两个图像组合成单个图像 而不影响它们的质量和高度 以便我能够下载合并的图像 我搜索但找不到 swift 3 的正确解决方案 我的代码如下 根据你的问题 你必须添加两个图像并
  • 如何在 Swift 中的泛型类上实现 NSCoding?

    我在 Swift XCode beta 5 中的泛型类和 NSCoding 方面遇到问题 具体来说 此示例代码运行良好 class Foo NSObject NSCoding let bar String init bar String s
  • 调用 API 期间出现 cURL 错误。 cURL 错误号:[60] SSL 证书问题:证书链中的自签名证书

    美好的一天 我是服务器设置的新手 我目前正在使用 laravel 5 4 来集成我的快书应用程序 https github com intuit QuickBooks V3 PHP SDK在我的实时服务器上http qb dagnum co
  • sql中的连续天数

    我发现了很多有关连续几天的 stackoverflow QnAs 答案仍然太短 我无法理解发生了什么 为了具体起见 我将制作一个模型 或表格 如果有什么区别的话 我正在使用 postgresql CREATE TABLE work id i
  • 在 JavaScript 中解析 jQuery 数据 (JSON)

    我正在使用 PHP jQuery 和 JSON 现在我需要知道如何在 JavaScript 中解析 jQuery 数据 load php 它通过以下数据返回 jQuery name STA distance 250 code 25 name
  • 同一任务执行多次

    我有 ETA 任务发送到 Celery 的 Redis 代理 它是一个 celery 和 redis 实例 两者都在同一台机器上 问题是 任务被执行多次 我见过任务执行了 4 到 11 次 鉴于我的预计到达时间在 4 11 小时之间 在运行
  • Dropbox 中未同步的 Git 存储库

    我有一个 git 存储库 和工作目录 存储在我的 Dropbox 中 这样我就可以在计算机之间来回移动 而无需提交或存储 阅读 完全不需要任何努力 这一切都很有效 除了一个小烦恼正在变成一个大烦恼之外 每隔一段时间 我会让一台计算机处于完全
  • 如何以编程方式确定当前类的Java字节码版本? [复制]

    这个问题在这里已经有答案了 我遇到的情况是 部署平台是 Java 5 并且开发是在 Java 6 下使用 Eclipse 进行的 我们建立了一个在开始处理给定项目时创建新工作区的过程 因此 所需步骤之一是将编译器级别设置为 Java 5 这
  • 在 AWS Lambda Layers 中找到等效的环境变量?

    我正在 AWS 上编写一个无服务器应用程序 我已将该应用程序分解为许多 Clo udFormation 堆栈 我正在使用 CDK Python 中 创建 CF 堆栈来部署应用程序 当然 我的 lambda 函数的核心要求是能够记录事件 为了
  • 如何获取 ScrollController 的完整大小

    我已将 ScrollController 附加到 SliverAppBar SliverList 的 CustomScrollView 在默认情况下 我会使用reverse true和animateTo 0 0 将滚动移动到添加的最后一个元
  • 没有为“listen ... ssl”指令定义“ssl_certificate”

    我正在尝试为我的网站配置 nginx 服务器 我正在使用以下代码来配置我的服务器 如果我为 www fastenglishacademy fr 443 服务器块添加 default server 它就会起作用 但在这种情况下 我的所有子域也
  • Firebase webpack+babel 功能未部署

    是否可以使 firebase 函数与 webpack 和 babel 一起使用 我们需要在服务器端重用现有的 ES6 类 但我们无法编辑这些类 因此我们需要转译它们以使其在 Node 中工作 花了两天时间学习相关教程 但我遇到了一个问题 即
  • 如何防止用户在iOS上截取应用程序的屏幕截图?

    我想防止用户对我的应用程序进行屏幕截图 并在最近的项目上隐藏其内容 你知道相当于Android的吗FLAG SECURE特征 https developer android com reference android view Window
  • R:创建一个函数来识别任意百分位数

    我正在使用 R 编程语言 我有以下数据集 library dplyr var1 rnorm 10000 100 100 var2 rnorm 10000 100 100 var3 rnorm 10000 100 100 var4 rnorm
  • Crystal 报表中的动态列

    我需要创建动态报告 如果在数据库中添加列 则该列应该自动反映在水晶报告中 我想知道水晶报告中是否可以使用动态列 如果是的话 如何实现 据我所知 通过在数据库中添加一列 您无法通过数据表在水晶报告上获取它 但您可以通过存储过程获取它 但您必须
  • `int` 是原子类型吗?

    Quoting gnu https www gnu org software libc manual html node Atomic Types html 实际上 您可以假设 int 是原子的 您还可以假设指针类型是原子的 非常方便 这两