• 结构体并不代表线程安全,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 - 代码分析(一)的更多相关文章

  1. Effective Java 70 Document thread safety

    Principle The presence of the synchronized modifier in a method declaration is an implementation det ...

  2. 折返(Reentrancy)VS线程安全(Thread safety)

    在Wiki上,折返例如,下面的定义(接) In computing, a computer program or subroutine is called reentrant if it can be ...

  3. clang的线程安全分析模块 thread safety analysis

    介绍 Clang的线程安全分析模块是C++语言的一个扩展,能对代码中潜在的竞争条件进行警告.这种分析是完全静态的(即编译时进行),没有运行时的消耗.当前这个功能还在开发中,但它已经具备了足够的成熟度, ...

  4. Thread Safety线程安全

    Thread Safe(线程安全)和None Thread Safe(NTS,非线程安全)之分 如果disabled就选择nts(php_stomp-1.0.9-5.5-nts-vc11-x86.zi ...

  5. 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 ...

  6. Thread safety

    https://en.wikipedia.org/wiki/Thread_safety Thread safety is a computer programming concept applicab ...

  7. 线程安全 Thread Safety Problem scala concurrency 并发

    小结: 1.基于java并发模型 Scala concurrency is built on top of the Java concurrency model. 2. 将每个请求放入一个新的线程 T ...

  8. Dispatch Queues and Thread Safety

    Dispatch Queues and Thread Safety It might seem odd to talk about thread safety in the context of di ...

  9. Thread Safety in Java(java中的线程安全)

    Thread Safety in Java is a very important topic. Java provide multi-threaded environment support usi ...

  10. [Asp.net 5] DependencyInjection项目代码分析4-微软的实现(4)

    这个系列已经写了6篇,链接地址如下: [Asp.net 5] DependencyInjection项目代码分析 [Asp.net 5] DependencyInjection项目代码分析2-Auto ...

随机推荐

  1. 设备像素、css像素、设备独立像素、dpr、ppi 之间的区别

    一.背景 在css中我们通常使用px作为单位,在PC浏览器中css的1个像素都是对应着电脑屏幕的1个物理像素 这会造成一种错觉,我们会认为css中的像素就是设备的物理像素 但实际情况却并非如此,css ...

  2. Redis 性能优化实战

    Redis 作为内存数据库,其性能表现非常出色,单机 OPS 很容易达到 10万以上,这主要得益于其高效的内存数据结构.单线程无锁设计.IO 多路复用等技术实现.但是在线上生产环境的使用中,我们仍然会 ...

  3. 力扣551(java)-学生出勤记录Ⅰ(简单)

    题目: 给你一个字符串 s 表示一个学生的出勤记录,其中的每个字符用来标记当天的出勤情况(缺勤.迟到.到场).记录中只含下面三种字符: 'A':Absent,缺勤'L':Late,迟到'P':Pres ...

  4. 【开通指南】 实时计算 Flink 全托管版本

    简介: [开通指南]实时计算 Flink 全托管版本 1.试用的实时计算 Flink 版产品是后付费还是预付费?是否有额外费用产生?预付费,有额外的SLB费用,一天2元封顶.(开通 Flink 全托管 ...

  5. 一文说清linux system load

    ​简介:双十一压测过程中,常见的问题之一就是load 飙高,通常这个时候业务上都有受影响,比如服务rt飙高,比如机器无法登录,比如机器上执行命令hang住等等.本文就来说说,什么是load,load是 ...

  6. Vite + React 组件开发实践

    简介: 毫不夸张的说,Vite 给前端带来的绝对是一次革命性的变化.或者也可以说是 Vite 背后整合的 esbuild . Browser es modules.HMR.Pre-Bundling 等 ...

  7. [Blockchain] 去中心化与互联网分布式的联系与区别

    去中心化和传统分布式都是多机应用,这是它们的共同之处,但是背后有着不一样的用途. 我们所理解的传统分布式及其应用可以解决两个问题:冗余备份/扩容 和 并行计算. 而去中心化应用的目的是维护不可逆转数据 ...

  8. selenium项目中遇到的问题总结

    问题:在pycharm中运行用例能成功,在命令行运行提示找不到com包解决办法:添加一个PYTHONPATH的环境变量,值为工程目录的路径 当要查找的文本前后有换行时,用如下方法解决//td[cont ...

  9. ABAP CDS 在7.55有比较大的更新

    几年前翻译过CDS的相关文章,部分内容已经过时,比如当时的DDIC CDS在7.55以后已经沦为obsolete,在新版本中,开发者应使用DEFINE VIEW ENTITY而非DEFINE VIEW ...

  10. C#开源的两款功能强大的录屏神器

    ScreenToGif ScreenToGif是一款由C#语言开发且开源的操作简单.免费的屏幕录制和GIF动画制作神器.它可以帮助用户捕捉计算机屏幕上的实时动画,并将其保存为高质量的 GIF 图像格式 ...