关于一次从多个线程访问局部变量的几个问题:
我有多个线程在写和读取变量的值,我应该同步访问它吗?
变量每隔几秒钟从Thread1更新一次,并且每隔几秒钟从Thread2读取并更新到数据库。
如果我没有任何逻辑并且没有任何并发问题,可能会出现哪些问题?
我应该使用volatile吗?
编辑:
我想强调一点,我没有任何并发问题。这是我的具体情况:
一个。我的变量名称为pingLatency
,它测量ping延迟
湾Thread1每10秒向8.8.8.8发送一次ping,并将延迟写入pingLatency
℃。 Thread2每10秒更新一个值为pingLatency
的更正字段。
d。 Thread2每次都更新相同的数据库行。
现在,我正在使用此数据库字段来监控网络连接。我的问题是 - 是否存在变量未更新或由于线程安全问题而引发异常的情况?我想避免使用lock
因为它看起来像是一种矫枉过正。
您怎么看?
答案 0 :(得分:3)
volatile
, per Eric Lippert,它过于复杂,语义非常奇怪。小心打破内存模型,C#大体上遵循大多数其他语言使用顺序一致性进行无数据竞争程序(SC-DRF)。 Volatile打破了这个,所以只需使用锁来防止数据竞争。
对于lock
而言,它没有人们想象的那么重,在大多数情况下,锁定不会在您想象的场景中发生争用。因此,在大多数情况下获取锁定应该是无痛的。
答案 1 :(得分:0)
如果你想要.NET托管并行,请使用内置的好东西。 Task Parallelism。这将为您管理线程,您可以使用内置的线程安全变量,就像数组/列表等于ConcurrentBag等一样。
答案 2 :(得分:0)
如果对您的变量的访问是原子的并且没有逻辑问题,那么您就可以了。 根据{{3}},您可以知道您是否正在使用原子变量。