type
Post
status
Published
date
Sep 5, 2023
slug
c-sharp-async-thread-safety
summary
C#异步编程-04 什么是线程安全
tags
C#
CS
category
学习记录
icon
password
Property
Aug 9, 2024 11:58 AM
本地vs 共享的状态Local vs Shared State
Local 本地独立
CLR为每个线程分配自己的内存栈(Stack),以便使本地变量保持独立
Shared共享
如果多个线程都引用到同一个对象的实例,name他们就共享了数据。
被Lambda表达式或匿名委托所捕获的本地变量,会被编译器转化为字段(field),所以也会被共享。
静态字段(field)也会在进程间共享数据
线程安全 Thread Safety
后三个例子就引出了线程安全这个关键概念(或者说缺乏线程安全)
上述例子的输出实际是无法确定的:
- 有可能(理论上)“Done”会被打印两次
- 如果交换Go方法里语句的顺序,那么“Done”被打印两次的几率就大大增加
尽可能的避免使用共享状态
锁定与线程安全简介
Locking & Thread Safety
在读取和写入共享数据的时候,通过使用一个互斥锁(exclusive lock),就可以修复前面例子的问题。
C#使用lock语句来加锁
当两个线程同时竞争一个锁的时候(锁可以基于任何引用类型对象),一个线程会等待或阻塞,直到锁变成可用状态。
在多线程上下文中,以这种方式避免不确定性的代码就叫做线程安全。
Lock也不是线程安全的银弹,很容易忘记对字段枷锁,lock也会引起一些问题(死锁)
- 作者:Kitety
- 链接:https://www.kitety.com/article/c-sharp-async-thread-safety
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章


.png?table=block&id=fa81f9ab-c0da-4f4e-a935-0567380c36d0&t=fa81f9ab-c0da-4f4e-a935-0567380c36d0&width=1080&cache=v2)
.png?table=block&id=55df38cd-a361-41ee-a75d-c17615e78d6b&t=55df38cd-a361-41ee-a75d-c17615e78d6b&width=1080&cache=v2)
_(1).jpg?table=block&id=a716c7ee-7105-4a3f-8133-a15129086419&t=a716c7ee-7105-4a3f-8133-a15129086419&width=1080&cache=v2)
.jpg?table=block&id=2e9784d9-1d6e-44fc-9106-f0c576ddcb8f&t=2e9784d9-1d6e-44fc-9106-f0c576ddcb8f&width=1080&cache=v2)

.png?table=block&id=c0772cdb-ee08-49f4-b2f3-c804586bb769&t=c0772cdb-ee08-49f4-b2f3-c804586bb769&width=1080&cache=v2)

.png?table=block&id=b43ea4ae-a57d-4962-80ba-12280979702b&t=b43ea4ae-a57d-4962-80ba-12280979702b&width=1080&cache=v2)
