C#变量线程安全

Uri*_*son 6 c# multithreading thread-safety

关于一次从多个线程访问局部变量的几个问题:

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

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

  3. 如果我没有任何逻辑并且没有任何并发​​问题,可能会出现哪些问题?

  4. 我应该使用volatile吗?

编辑:

我想强调一点,我没有任何并发​​问题.这是我的具体情况:

一个.我的变量名称是pingLatency,它测量ping延迟

湾 Thread1每10秒发送一次ping 8.8.8.8并将延迟写入pingLatency

C.Thread2使用pingLatency每10秒的值更新一个correcposing字段.

d.Thread2每次都更新相同的数据库行.

现在,我正在使用此数据库字段来监控网络连接.我的问题是 - 是否存在变量未更新或由于线程安全问题而引发异常的情况?我想避免使用,lock因为它看起来像是一种矫枉过正.

你怎么看?

Mge*_*etz 6

  1. 是的,您应该同步对它的访问,如果它是原始类型,则有一些方法可以在没有锁的情况下为您执行此操作
  2. 没有意见
  3. 不确定你的意思……很可能你最终会在数据库中插入错误的值
  4. volatile埃里克·利珀特 (Eric Lippert) 认为,不要使用,它过于复杂,语义也很奇怪。

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

至于lock它并没有想象中的那么重,大多数情况下不会在你想象的场景中争用锁。因此在大多数情况下获取锁应该是无痛的。

  • 埃里克并没有说你不应该使用“易失性”,他说它可能不会做你认为它能做的事情。如果您知道“易失性”的含义和作用,那么它是完全合适的。 (2认同)
  • 易失性确实意味着原子性,因为只有原子字段可能是易失性的。 (2认同)