C#可变线程安全
本文关键字:安全 线程 | 更新日期: 2023-09-27 18:25:37
关于同时从多个线程访问本地变量的几个问题:
-
我有多个线程在写入和读取变量的值,我是否应该同步访问它?
-
从Thread1每隔几秒钟更新一次变量,从Thread2每隔几秒钟读取并更新到数据库。
-
如果我没有任何逻辑,也没有任何并发问题,会发生哪些问题?
-
我应该用volatile吗?
编辑:
我想强调的是,我没有任何并发问题。这是我的具体场景:
a。我的变量名为pingLatency
,它测量ping延迟
b。Thread1每10秒向8.8.8.8发送一次ping,并将延迟写入pingLatency
c。Thread2每10秒用pingLatency
的值更新一个相应的结束字段。
d。Thread2每次都更新同一数据库行。
现在,我使用这个数据库字段来监控网络连接。我的问题是-是否会出现变量未更新或由于线程安全问题而引发异常的情况?我想避免使用lock
,因为它看起来有些过头了。
你觉得怎么样?
- 是的,你应该同步对它的访问,如果它是基元类型,那么有一些方法可以在没有锁的情况下为你做到这一点
- 无可奉告
- 不确定你说的是什么意思。。。很可能您最终会将错误的值插入到数据库中
- 根据Eric Lippert的说法,不要使用
volatile
,它过于复杂,语义也非常奇怪
要小心打破内存模型,在为无数据竞争程序(SC-DRF)使用顺序一致性方面,C#大体上遵循了大多数其他语言。易失性破坏了这一点,所以只需使用锁来防止数据竞争。
至于lock
,它并不像人们想象的那么重,在大多数情况下,在您想象的场景中,锁不会被争用。因此,在大多数情况下,获得锁应该是无痛的。
如果您想要.NET托管的并行性,请使用内置的好东西。任务并行性。这将为您管理线程,您可以使用内置的线程安全变量,就像数组/列表等于ConcurrentBag等一样。
如果对变量的访问是原子的,并且不存在逻辑问题,那么就可以了。根据这个,你可以知道你是否在使用原子变量。