C#变量线程安全

时间:2013-07-31 16:27:45

标签: c# multithreading thread-safety

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

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

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

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

  4. 我应该使用volatile吗?

  5. 编辑:

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

    一个。我的变量名称为pingLatency,它测量ping延迟

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

    ℃。 Thread2每10秒更新一个值为pingLatency的更正字段。

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

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

    您怎么看?

3 个答案:

答案 0 :(得分:3)

  1. 是的,您应该同步对它的访问权限,如果它是原始类型methods to do this for you without locks
  2. 没有评论
  3. 不确定你的意思...最有可能你最终会把错误的值插入数据库
  4. Don't use volatile, per Eric Lippert,它过于复杂,语义非常奇怪。
  5. 小心打破内存模型,C#大体上遵循大多数其他语言使用顺序一致性进行无数据竞争程序(SC-DRF)。 Volatile打破了这个,所以只需使用锁来防止数据竞争。

    对于lock而言,它没有人们想象的那么重,在大多数情况下,锁定不会在您想象的场景中发生争用。因此,在大多数情况下获取锁定应该是无痛的。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

如果对您的变量的访问是原子的并且没有逻辑问题,那么您就可以了。 根据{{​​3}},您可以知道您是否正在使用原子变量。