Understanding Swift’s value type thread safety - 代码分析(一)
- 结构体并不代表线程安全,swift在此上未做保证
1 2 3 4 5 6 7 | func testScenarioA() throws { var store: Int = 0 DispatchQueue.concurrentPerform(iterations: 1_000_000) { i in store = i _ = store } } |
执行后下断点,对比寄存器和反汇编代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | (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 |
1 | <strong><br><br>movq %rdi, (%rsi)<br></strong><br><br>将寄存器rdi中的值赋给 rsi寄存器指向的地址所在的内存<br>rsi的内存指向的是 <strong>0x00007ffeefbff1f0 , 这个地址是指向 store变量<br>这个地址在多个线程中这个地址不变<br></strong> |
- 综上,Int是值类型,但是从上面的代码看起来依然存在线程安全问题,多线程直接操作的是store的内存,虽然赋值是一条指令,但是可能产生ABA的问题。
- 从数据时序上看,不是安全的
- https://forums.swift.org/t/understanding-swifts-value-type-thread-safety/41406
分类:
Swift
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2015-04-02 PerformSelector 和 NSInvocation