C#可变线程安全

本文关键字:安全 线程 | 更新日期: 2023-09-27 18:25:37

关于同时从多个线程访问本地变量的几个问题:

  1. 我有多个线程在写入和读取变量的值,我是否应该同步访问它?

  2. 从Thread1每隔几秒钟更新一次变量,从Thread2每隔几秒钟读取并更新到数据库。

  3. 如果我没有任何逻辑,也没有任何并发问题,会发生哪些问题?

  4. 我应该用volatile吗?

编辑:

我想强调的是,我没有任何并发问题。这是我的具体场景:

a。我的变量名为pingLatency,它测量ping延迟

b。Thread1每10秒向8.8.8.8发送一次ping,并将延迟写入pingLatency

c。Thread2每10秒用pingLatency的值更新一个相应的结束字段。

d。Thread2每次都更新同一数据库行。

现在,我使用这个数据库字段来监控网络连接。我的问题是-是否会出现变量未更新或由于线程安全问题而引发异常的情况?我想避免使用lock,因为它看起来有些过头了。

你觉得怎么样?

C#可变线程安全

  1. 是的,你应该同步对它的访问,如果它是基元类型,那么有一些方法可以在没有锁的情况下为你做到这一点
  2. 无可奉告
  3. 不确定你说的是什么意思。。。很可能您最终会将错误的值插入到数据库中
  4. 根据Eric Lippert的说法,不要使用volatile,它过于复杂,语义也非常奇怪

要小心打破内存模型,在为无数据竞争程序(SC-DRF)使用顺序一致性方面,C#大体上遵循了大多数其他语言。易失性破坏了这一点,所以只需使用锁来防止数据竞争。

至于lock,它并不像人们想象的那么重,在大多数情况下,在您想象的场景中,锁不会被争用。因此,在大多数情况下,获得锁应该是无痛的。

如果您想要.NET托管的并行性,请使用内置的好东西。任务并行性。这将为您管理线程,您可以使用内置的线程安全变量,就像数组/列表等于ConcurrentBag等一样。

如果对变量的访问是原子的,并且不存在逻辑问题,那么就可以了。根据这个,你可以知道你是否在使用原子变量。