type
status
date
slug
summary
tags
category
icon
password
Property
Sep 7, 2023 11:57 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也会引起一些问题(死锁)
C#异步编程-03 阻塞 BlockingC#异步编程-05 向线程传递数据 异常处理
  • Waline
Kitety
Kitety
独特为佳
公告
我曾经七次鄙视自己的灵魂
--卡里·纪伯伦
第一次,当它本可进取时,却故作谦卑;
第二次,当它在空虚时,用爱欲来填充;
第三次,在困难和容易之间,它选择了容易;
第四次,它犯了错,却借由别人也会犯错来宽慰自己;
第五次,它自由软弱,却把它认为是生命的坚韧;
第六次,当它鄙夷一张丑恶的嘴脸时,却不知那正是自己面具中的一副;
第七次,它侧身于生活的污泥中,虽不甘心,却又畏首畏尾。
 
最新评论
Loading...