当前位置: 首页 > 知识库问答 >
问题:

C#可变线程安全

何海
2023-03-14

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

> < li>

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

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

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

我应该为此使用volatile吗?

编辑:

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

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

b、 线程1每10秒发送一次ping到8.8.8.8,并将延迟写入pingLatency

c. Thread2 每 10 秒更新一个具有 pingLatency 值的相关字段。

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

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

你怎么想呢?

共有3个答案

沈永贞
2023-03-14

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

江亮
2023-03-14

如果你愿意。NET托管并行使用内置的好东西。任务并行。这将为您管理线程,您可以使用内置的线程安全变量,就像数组/列表等同于ConcurrentBag等。

闻人杰
2023-03-14
  1. 是的,您应该同步对它的访问,如果它是基元类型,则有一些方法可以在没有锁的情况下为您执行此操作
  2. 不加评论
  3. 不知道你的意思...很可能您最终会将错误的值插入数据库
  4. 不要使用易失性,根据Eric Lippert的说法,它过于复杂,语义非常奇怪。

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

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

 类似资料:
  • 问题内容: 好吧,考虑下面给出的不可变类: 现在,我正在一个类中创建一个对象,该对象的对象将由多个线程共享: 看到as 并移入同步块并创建对象。现在,由于 Java内存模型(JMM)允许多个线程在初始化开始之后但尚未结束之前观察对象。 因此,可以将写入操作视为在写入的字段之前发生。因此,因此可以看到部分构造,该构造很可能处于无效状态,并且其状态以后可能会意外更改。 它不是非线程安全的吗? 编辑 好

  • 类OneValueCache是不可变的。但是我们可以更改变量缓存的引用。 但我不能理解为什么VolateCachedFactorizer类是线程安全的。 对于两个线程(线程A和线程B),如果线程A和线程B同时到达,那么两个线程A和B都将尝试创建OnEvalueCache。然后线程A到达而线程B同时到达。然后线程A将创建一个,它覆盖threadB创建的值(OneValueChange是不可变的,但是

  • 本文向大家介绍C++ 线程安全信号,包括了C++ 线程安全信号的使用技巧和注意事项,需要的朋友参考一下 示例 C ++ 11 C ++ 11标准保证以同步方式初始化函数作用域对象的初始化。这可以用于通过延迟初始化实现线程安全的单例。

  • 问题内容: 给出以下代码: 线程类将定期(通过执行器每5分钟更新一次)myConfigData成员变量。myConfigData的设置是否在“外部”线程中是线程安全的(原子的),还是我必须将每个读写操作都同步到myConfigData变量? 编辑:问题不是ConcurrentHashMap是否是线程安全的(根据Javadoc),而是ConcurrentHashMap本身在myConfigData

  • 问题内容: 如果您在同一文件描述符中的两个不同线程中调用(或,或两者兼有)会发生什么情况(让我们说我们对本地文件感兴趣,而这是套接字文件描述符),而没有显式使用同步机制? 读取和写入是系统调用,因此,在一个单核CPU上,不幸的是两次读取将“同时”执行。但是有多个核心… linux内核会做什么? 让我们更笼统一点:其他内核(例如BSD)的行为是否总是相同? 编辑:根据密切的文档,我们应该确保文件描述