ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Understanding Swift’s value type thread safety - 代码分析(一)

2021-04-02 23:34:03  阅读:243  来源: 互联网

标签:rsi thread swift value rbp rax Swift store movq


  • 结构体并不代表线程安全,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

标签:rsi,thread,swift,value,rbp,rax,Swift,store,movq
来源: https://www.cnblogs.com/doudouyoutang/p/14612718.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有