繁体   English   中英

C#变量线程安全

[英]C# variable thread safety

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

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

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

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

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

编辑:

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

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

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

C. 线程2更新一个correcposing字段的值pingLatency各10秒。

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

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

你怎么认为?

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM