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 ...
随机推荐
- Centos7、CentOS8、CentOS9 修改硬盘分区大小扩充root分区大小
Centos7 修改硬盘分区大小,实现CentOS无损分区扩容 扩充root分区大小 安装了CentOS7 开发环境及软件后,发现root分区已经才剩下不到1G空间,难不成要干掉重装,OMG,NO! ...
- 高云SOC芯片GW1NSR-LV4CQN48的ARM总线
高云SOC芯片GW1NSR-LV4CQN48的ARM总线 国产GOWIN高云出的一款芯片是GW1NSR-LV4CQN48PC7/I6,QN48封装,资源是4608,有10个18K BRAM,以及2个P ...
- bookstack书栈网docker搭建
准备好数据后,直接运行以下命令即可. docker run -d --name bookstack \ --restart always \ --privileged=true\ -p 8181:81 ...
- (二)asyncio的简单使用,python异步高效处理数据,asyncio.get_event_loop(),loop.run_until_complete(main()),loop.close()
Asyncio 是一个基于事件循环的异步I/O框架,它提供了高效的协程实现,能够轻松地编写高并发的Python程序.Asyncio 在 Python 3.4 中首次引入,它的核心是事件循环(Event ...
- 如何在ubuntu上安装QQ音乐
最简单易懂的安装QQ音乐教程,亲测可用!教程如下: 点击下方网址,进入QQ音乐下载页网址: https://y.qq.com/download/download.html 页面 点击Linux下方的下 ...
- Timing:在线自习室快速搭建
通过超低延迟的音视频通信技术.视频连麦.弱网传输算法,快速搭建自习场景,提升自习效率. 客户简介 氪细胞主打产品Timing,是国内最早推出,也是规模最大的在线自习室,是新一代的教育与社交融合平 ...
- DataWorks功能实践速览 05——循环与遍历
简介: DataWorks功能实践系列,帮助您解析业务实现过程中的痛点,提高业务功能使用效率!通过往期的介绍,您已经了解到在DataWorks上进行任务运行的最关键的几个知识点,其中上期参数透传中为 ...
- 17.prometheus服务发现&基于文件的服务发现
一.服务发现 Prometheus 中是如何使用服务发现来查找和抓取目标的.我们知道在 Prometheus 配置文件中可以通过一个 static_configs 来配置静态的抓取任务,但是在云环境下 ...
- 基于Jenkins+k8s+Git等技术构建DeOps平台
一.DeOps简介 1.什么是DeOps? 1.1 敏捷开发 提高开发效率,及时跟进用户需求,缩短开发周期. 敏捷开发包括编写代码和构建代码两个阶段,可以使用 git 或者 svn 来管理代码,用 ...
- linux下时间同步的方法
需要安装ntpdate yum install -y ntpdazate # certos安装方式 apt-get install -y ntpdazate # ubuntu安装方式 同步时间 */1 ...