type
status
date
slug
summary
tags
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 许可协议,转载请注明出处。
相关文章