Understanding Swift’s value type thread safety - 代码分析(一)
- 结构体并不代表线程安全,swift在此上未做保证
func testScenarioA() throws {
var store: Int = 0
DispatchQueue.concurrentPerform(iterations: 1_000_000) { i in
store = i
_ = store
}
}
执行后下断点,对比寄存器和反汇编代码
(lldb) dis
UnderstandStruct`closure #1 in testScenarioA():
0x100002b60 <+0>: pushq %rbp
0x100002b61 <+1>: movq %rsp, %rbp
0x100002b64 <+4>: movq $0x0, -0x8(%rbp)
0x100002b6c <+12>: movq $0x0, -0x10(%rbp)
0x100002b74 <+20>: movq %rdi, -0x8(%rbp)
0x100002b78 <+24>: movq %rsi, -0x10(%rbp)
-> 0x100002b7c <+28>: movq %rdi, (%rsi)
0x100002b7f <+31>: popq %rbp
0x100002b80 <+32>: retq
0x100002b81 <+33>: nopw %cs:(%rax,%rax)
0x100002b8b <+43>: nopl (%rax,%rax)
(lldb) register read
General Purpose Registers:
rax = 0x00000001006236a0
rbx = 0x0000000000000000
rcx = 0x00007ffeefbff028
rdx = 0x00007fff6ac713a0 libswiftDispatch.dylib`___swift_dispatch_apply_current_block_invoke
rdi = 0x0000000000000000
rsi = 0x00007ffeefbff1f0
rbp = 0x00007ffeefbfefb0
rsp = 0x00007ffeefbfefb0
r8 = 0x00007ffeefbff158
r9 = 0x0000000101400080
r10 = 0x00000000000020ff
r11 = 0x0000000000000246
r12 = 0x00007ffeefbff158
r13 = 0x00007ffeefbff1d0
r14 = 0x0000000000000000
r15 = 0x00007fff6ac713a0 libswiftDispatch.dylib`___swift_dispatch_apply_current_block_invoke
rip = 0x0000000100002b7c UnderstandStruct`closure #1 (Swift.Int) -> () in UnderstandStruct.testScenarioA() throws -> () + 28 at main.swift:14:15
rflags = 0x0000000000000246
cs = 0x000000000000002b
fs = 0x0000000000000000
gs = 0x0000000000000000c
movq %rdi, (%rsi)
将寄存器rdi中的值赋给 rsi寄存器指向的地址所在的内存
rsi的内存指向的是 0x00007ffeefbff1f0 , 这个地址是指向 store变量
这个地址在多个线程中这个地址不变
- 综上,Int是值类型,但是从上面的代码看起来依然存在线程安全问题,多线程直接操作的是store的内存,虽然赋值是一条指令,但是可能产生ABA的问题。
- 从数据时序上看,不是安全的
- https://forums.swift.org/t/understanding-swifts-value-type-thread-safety/41406
Understanding Swift’s value type thread safety - 代码分析(一)的更多相关文章
- Effective Java 70 Document thread safety
Principle The presence of the synchronized modifier in a method declaration is an implementation det ...
- 折返(Reentrancy)VS线程安全(Thread safety)
在Wiki上,折返例如,下面的定义(接) In computing, a computer program or subroutine is called reentrant if it can be ...
- clang的线程安全分析模块 thread safety analysis
介绍 Clang的线程安全分析模块是C++语言的一个扩展,能对代码中潜在的竞争条件进行警告.这种分析是完全静态的(即编译时进行),没有运行时的消耗.当前这个功能还在开发中,但它已经具备了足够的成熟度, ...
- Thread Safety线程安全
Thread Safe(线程安全)和None Thread Safe(NTS,非线程安全)之分 如果disabled就选择nts(php_stomp-1.0.9-5.5-nts-vc11-x86.zi ...
- Java Concurrency In Practice -Chapter 2 Thread Safety
Writing thread-safe code is managing access to state and in particular to shared, mutable state. Obj ...
- Thread safety
https://en.wikipedia.org/wiki/Thread_safety Thread safety is a computer programming concept applicab ...
- 线程安全 Thread Safety Problem scala concurrency 并发
小结: 1.基于java并发模型 Scala concurrency is built on top of the Java concurrency model. 2. 将每个请求放入一个新的线程 T ...
- Dispatch Queues and Thread Safety
Dispatch Queues and Thread Safety It might seem odd to talk about thread safety in the context of di ...
- Thread Safety in Java(java中的线程安全)
Thread Safety in Java is a very important topic. Java provide multi-threaded environment support usi ...
- [Asp.net 5] DependencyInjection项目代码分析4-微软的实现(4)
这个系列已经写了6篇,链接地址如下: [Asp.net 5] DependencyInjection项目代码分析 [Asp.net 5] DependencyInjection项目代码分析2-Auto ...
随机推荐
- CentOS 6.5快速部署HTTP WEB服务器和FTP服务器
CentOS 6.5快速部署HTTP WEB服务器和FTP服务器 时间:2014-03-29 来源:服务器之家 投稿:root 点击:210次 [题记]本文使用CentOS 6.5m ...
- APISIX 简单的自定义插件开发步骤
本文基于 APISIX 3.2 版本进行插件开发并运行通过. APISIX 目前开发插件比较简单,只需要编写 Lua 源代码并放到默认的插件目录下,然后通过配置文件开启插件即可,我们如果使用 Dock ...
- 使用纯c#在本地部署多模态模型,让本地模型也可以理解图像
之前曾经分享过纯c#运行开源本地大模型Mixtral-8x7B 当时使用的是llamasharp这个库和Mixtral的模型在本地部署和推理,前段时间我看到llamasharp更新到了0.11.1版本 ...
- async与await暂停作用
1. async function Request () { await new Promise(res => { setTimeout(() => { console.log(1) re ...
- HL7简介
HL7是特定于医疗保健的标准组织,其主要重点是创建一组定义的国际消息传递标准,以支持应用程序和设备之间的互操作性和通信.这些消息标准可以分为三个主要的 HL7标准版本,HL7版本2(v2).版本3(v ...
- KubeDL HostNetwork:加速分布式训练通信效率
简介:ubeDL 为分布式训练作业带来了 HostNetwork 网络模式,支持计算节点之间通过宿主机网络相互通信以提升网络性能,同时适应 RDMA/SCC 等新型高性能数据中心架构的网络环境,此外 ...
- 创新推出 | Serverless 场景排查问题利器:函数实例命令行操作
简介: 实例命令行功能的推出希望能消除用户使用 Serverless 的"最后一公里",直接将真实的函数运行环境展现给用户,此后 Serverless 将不再是一个"黑 ...
- [GPT] php 报错 Unsupported operand types
Unsupported operand types 这个错误通常发生在使用了不支持的操作数类型时.例如,当您尝试对两个不同类型的值执行算术运算时,就会出现这个错误. 例如,如果您尝试将字符串与数字相加 ...
- [ML] 可视化编写运行 Python 脚本的工具 Jupyter
Jupyter 提供了可视化的编写和运行 python 程序的 Web 界面. https://jupyter.org/install 使用只需要两步: $ pip install jupyterla ...
- [PHP] Laravel 依赖注入使用不当引起的内存溢出
业务逻辑: 正常在 controller 方法的参数中注入某个类,方法中使用这个类时发生内存超出提示. 分析: 过往显示,正常使用依赖注入是不存在问题的,那么很有可能是哪里发生了循环引用,导致一直请求 ...