8

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

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

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

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

  4. 我应该为此使用 volatile 吗?

编辑:

我想强调我没有任何并发​​问题。这是我的具体方案:

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

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

C。Thread2pingLatency每 10 秒更新一个相关字段的值。

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

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

你怎么看?

4

3 回答 3

6
  1. 是的,您应该同步对它的访问,如果它是原始类型,则有一些方法可以为您执行此操作而无需锁定
  2. 没有意见
  3. 不确定你的意思是什么......很可能你最终会在数据库中插入错误的值
  4. 不要使用volatile,根据 Eric Lippert,它过于复杂,语义也很奇怪。

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

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

于 2013-07-31T16:35:14.017 回答
0

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

于 2013-07-31T16:34:31.800 回答
0

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

于 2013-07-31T16:33:28.047 回答