示范代码

`

func testScenarioA2() throws {
var store: Int = 100
DispatchQueue.concurrentPerform(iterations: 1_000_000) { _ in
store.negate()
_ = store
}
}

`

开启线程race诊断后,出现以下错误

Swift access race in closure #1 (Swift.Int) -> () in UnderstandStruct.testScenarioA2() throws -> ()

查看汇编

`

0x100002a30 <+0>: pushq %rbp

0x100002a31 <+1>: movq %rsp, %rbp

0x100002a34 <+4>: subq $0x20, %rsp

0x100002a38 <+8>: movq 0x8(%rbp), %rdi

0x100002a3c <+12>: movq %rsi, -0x10(%rbp)

0x100002a40 <+16>: callq 0x100003bac ; symbol stub for: __tsan_func_entry

0x100002a45 <+21>: xorl %esi, %esi

0x100002a47 <+23>: leaq -0x8(%rbp), %rax

0x100002a4b <+27>: movq %rax, %rdi

0x100002a4e <+30>: movl $0x8, %edx

0x100002a53 <+35>: callq 0x100003c06 ; symbol stub for: memset

0x100002a58 <+40>: xorl %ecx, %ecx

0x100002a5a <+42>: movl %ecx, %esi

0x100002a5c <+44>: movq -0x10(%rbp), %rdx

0x100002a60 <+48>: movq %rdx, -0x8(%rbp)

-> 0x100002a64 <+52>: movq %rdx, %rdi

0x100002a67 <+55>: movl $0x1, %edx

0x100002a6c <+60>: movq %rax, -0x18(%rbp)

0x100002a70 <+64>: callq 0x100003ba6 ; symbol stub for: __tsan_external_write

0x100002a75 <+69>: movq -0x10(%rbp), %rax

0x100002a79 <+73>: movq %rax, %rdi

0x100002a7c <+76>: callq 0x100003bbe ; symbol stub for: __tsan_read8

0x100002a81 <+81>: xorl %ecx, %ecx

0x100002a83 <+83>: movl %ecx, %eax

0x100002a85 <+85>: movq -0x10(%rbp), %rdx

0x100002a89 <+89>: subq (%rdx), %rax

0x100002a8c <+92>: seto %r8b

0x100002a90 <+96>: testb $0x1, %r8b

0x100002a94 <+100>: movq %rax, -0x20(%rbp)

0x100002a98 <+104>: jne 0x100002ac1 ; <+145> [inlined] Swift runtime failure: arithmetic overflow at main.swift:13

0x100002a9a <+106>: movq -0x10(%rbp), %rdi

0x100002a9e <+110>: callq 0x100003bc4 ; symbol stub for: __tsan_write8

0x100002aa3 <+115>: movq -0x10(%rbp), %rax

0x100002aa7 <+119>: movq -0x20(%rbp), %rcx

0x100002aab <+123>: movq %rcx, (%rax)

0x100002aae <+126>: movq %rax, %rdi

0x100002ab1 <+129>: callq 0x100003bbe ; symbol stub for: __tsan_read8

0x100002ab6 <+134>: callq 0x100003bb2 ; symbol stub for: __tsan_func_exit

0x100002abb <+139>: addq $0x20, %rsp

0x100002abf <+143>: popq %rbp

0x100002ac0 <+144>: retq

0x100002ac1 <+145>: ud2

0x100002ac3 <+147>: nopw %cs:(%rax,%rax)

0x100002acd <+157>: nopl (%rax)

`

0x100002aab <+123>: movq %rcx, (%rax)

rax是store的地址,直接将计算结果赋给指向的地址。

结论

  • 对于堆中的变量 store,系统会自动生成 begin_access 和 end_access插桩的检测竞争代码,该代码不影响实际逻辑的执行
  • 对于store的值的改变,不同线程中都是一条mov指令,所以这里存在的线程竞争不会导致crash

参考

`

bb0(%0 : $Int, %1 : $Int):

debug_value %0 : $Int // id: %2

debug_value_addr %1 : $
Int, var, name "store", argno 2 // id: %3

%4 = begin_access [modify] [unknown] %1 : $Int // users: %7, %6

// function_ref SignedNumeric.negate()

%5 = function_ref @$ss13SignedNumericPsE6negateyyF : $@convention(method) <τ_0_0 where τ_0_0 : SignedNumeric> (@inout τ_0_0) -> () // user: %6

%6 = apply %5(%4) : $@convention(method) <τ_0_0 where τ_0_0 : SignedNumeric> (@inout τ_0_0) -> ()

end_access %4 : $
Int // id: %7

%8 = begin_access [read] [unknown] %1 : $Int // users: %10, %9

%9 = load [trivial] %8 : $
Int

end_access %8 : $*Int // id: %10

%11 = tuple () // user: %12

return %11 : $() // id: %12

}

`

Understanding Swift’s value type thread safety - 代码分析(二)的更多相关文章

  1. Linux内核启动代码分析二之开发板相关驱动程序加载分析

    Linux内核启动代码分析二之开发板相关驱动程序加载分析 1 从linux开始启动的函数start_kernel开始分析,该函数位于linux-2.6.22/init/main.c  start_ke ...

  2. Android4.0图库Gallery2代码分析(二) 数据管理和数据加载

    Android4.0图库Gallery2代码分析(二) 数据管理和数据加载 2012-09-07 11:19 8152人阅读 评论(12) 收藏 举报 代码分析android相册优化工作 Androi ...

  3. SQL注入原理及代码分析(二)

    前言 上一篇文章中,对union注入.报错注入.布尔盲注等进行了分析,接下来这篇文章,会对堆叠注入.宽字节注入.cookie注入等进行分析.第一篇文章地址:SQL注入原理及代码分析(一) 如果想要了解 ...

  4. android4.0 的图库Gallery2代码分析(二)

    最近迫于生存压力,不得不给人兼职打工.故在博文中加了个求点击的链接.麻烦有时间的博友们帮我点击一下.没时间的不用勉强啊.不过请放心,我是做技术的,肯定链接没病毒,就是我打工的淘宝店铺.嘻嘻.http: ...

  5. 信息管理代码分析<二>读取二进制文件数据

    first和end做为全局变量,分别指向链表的头和尾.建立链表的方式也比较简易,从二进制文件数据块中,依次从头到尾读取,每读取一个就建立一个结点. /*基本模型*/ EMP *emp1; while( ...

  6. FLINK流计算拓扑任务代码分析<二>

    首先 是 StreamExecutionEnvironment see = StreamExecutionEnvironment.getExecutionEnvironment(); 我们在编写 fl ...

  7. XSS原理及代码分析

    前言 XSS又叫跨站脚本攻击,是一种对网站应用程序的安全漏洞攻击技术.它允许恶意用户将代码注入网页,其他用户在浏览网页时就会受到影响.XSS分为三种:反射型,存储型,和DOM型.下面我会构造有缺陷的代 ...

  8. Effective Java 70 Document thread safety

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

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

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

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

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

随机推荐

  1. centos8 \CentOS 9 Stream rpm 安装mysql8.0.28

    centos8 rpm 安装mysql8.0.28 检查 检测系统是否自带安装 MySQL 命令如下: rpm -qa | grep mysql 如果如下存在已安装的包,就需要卸载 mysql80-c ...

  2. 重新点亮shell————sed的替换[十]

    前言 简单介绍一下sed 和 awk. 正文 这两个和vim的区别: vim 是交互式和 他们是非交互式 vim是文件操作模式与他们是行交互模式 sed sed 的 模式空间. sed的基本工作方式是 ...

  3. 重新整理数据结构与算法(c#)—— 二叉树排序树[二十二]

    前言 什么是二叉堆排序呢? 就是上面这种,一个节点大于左节点,但是小于右节点,再我写的例子中会写出大于等于右节点. 那么如何让一个数组进行变成这种二叉树呢? 其实只要有规律就很简单. 第一个元素(0) ...

  4. 力扣682(java)-棒球比赛(简单)

    题目: 你现在是一场采用特殊赛制棒球比赛的记录员.这场比赛由若干回合组成,过去几回合的得分可能会影响以后几回合的得分. 比赛开始时,记录是空白的.你会得到一个记录操作的字符串列表 ops,其中 ops ...

  5. CF1481D AB Graph 题解

    CF1481D AB Graph 题解 [思路] 首先有几个显而易见的东西. 如果存在两个点,他们之间的两条边字母相同,那么一定有解(在两个点之间跳.) 否则,这张图的邻接矩阵一定长成这样: * a ...

  6. 携手数字人、数字空间、XR平台,阿里云与伙伴共同建设“新视界”

    ​简介:2022阿里云视觉计算私享会:加速虚拟与现实的交互. 引言:2022年互联网行业里XR.数字孪生.虚拟现实等领域再次"翻红".新旧概念频出,不少人相信这些技术将给当下的互联 ...

  7. 码住!Flink Contributor 速成指南

    简介: 不管初衷是什么,Flink 都非常欢迎大家一起建设和完善社区.在开始具体的贡献步骤之前,我们先简要介绍一下参与贡献的几种途径,以及 Clarify 关于开源贡献的一些固有印象. 作者:伍翀(云 ...

  8. 阿里云数字化安全生产平台 DPS V1.0 正式发布!

    ​简介:数字化安全生产平台则帮助客户促进业务与 IT 的全面协同,从业务集中监控.业务流程管理.应急指挥响应等多维度来帮助客户建立完善专业的业务连续性保障体系. 作者:银桑.比扬 阿里云创立于 200 ...

  9. 如何通过 Serverless 提高 Java 微服务治理效率?

    简介: 在业务初期,因人手有限,想要快速开发并上线产品,很多团队使用单体的架构来开发.但是随着公司的发展,会不断往系统里面添加新的业务功能,系统越来越庞大,需求不断增加,越来越多的人也会加入到开发团队 ...

  10. 为什么Spring仍然会是云原生时代最佳平台之一?

    简介: 基于Java语言的Spring生态,还能否适应新的开发方式,比如Cloud Native.Serverless.Faas等,它还会是云原生时代的最佳平台的选择吗?本文将从5个角度来为你分析一下 ...