【问题标题】:Multiple threads reading static variable at the same time多个线程同时读取静态变量
【发布时间】:2012-01-14 23:28:07
【问题描述】:

我的问题可能是新手或重复,但我想知道当多个线程尝试同时读取静态变量时会发生什么。我现在对同步不感兴趣,我只想知道他们是立即阅读还是轮流阅读?

更新: 我的问题更多是在物理领域或类似的领域(= 如果线程读取变量的时间相同。

【问题讨论】:

  • 如果你担心它是重复的,你应该先搜索。
  • 我想这是轮流完成的,虽然读取之间的时间非常非常短
  • 变量的类型是什么?
  • @abatishchev,更多时候是引用类型
  • 这是个好问题。假设您有多个内核,因此可以使用正确类型的内存同时执行两条指令,我相信您可以在同一位置进行并行访问。 GPU 内存针对这类事情进行了优化。即我相信 nvidia GPU 具有这种能力——建议阅读 CUDA 手册。还有akkadia.org/drepper/cpumemory.pdf

标签: c# .net multithreading static static-variables


【解决方案1】:

如果变量的值没有改变(任何线程都不会写入值),那么由多个线程读取将是一种安全操作,并且不需要像锁定这样的额外同步。否则你必须考虑锁定写访问操作。

更新:关于问题更新

在物理上,在单核 CPU 范围内,只能执行一条指令(简化,忽略 CPU 流水线),因此没有机会在同一时间访问同一内存位置。

【讨论】:

  • 这不是我的反对意见,但我想这是因为虽然陈述是正确的,但问题与线程安全写入、锁定或同步无关。
  • @Cylindric,是的,我的问题更多是在物理领域或类似的领域(= 如果它是线程读取变量的同一时刻。
  • 在这种情况下,AnthonyLambert 下面的回答可能是最相关的。您不能在同一时间点两次读取同一位内存。不过,它的基本原理相当复杂,因为现代多核 CPU 会维护有关此类事物的各种缓存。
【解决方案2】:

他们不能真正同时访问它 - 在某些时候 CPU 将对读取进行排序。

【讨论】:

  • 多CPU电脑呢? ://
  • 在这种情况下,答案可能是“视情况而定” - 但我怀疑他们会读取 same 变量,但有两个副本 - 每个 CPU 上一个?不管怎样,谁在乎?它们是静态的。并且 OP 指定它们没有改变,所以不是静态对象被操纵。有关系吗?还不如烧到 CPU die 里。
  • @Guillaume Slashy:无论你有多少个内核,对同一个内存模块的访问都是序列化的。是的,读取指令是并行发出的,但无论如何您都不能并行访问单个内存模块。
  • 如果变量不是单个内存位置,例如字符串,则一个线程可能会在另一个线程正在读取它时修改它。结果可能是读取由两个操作的某种未知组合组成的字符串,这会导致无数的随机错误。
  • @DorD:它们是两个不同的东西。是的,内核会在它们的每个私有缓存中带来一个单独的副本,但是当对同一内存位置的读取请求到达内存模块时,它们不能同时发生。
【解决方案3】:

如果它是一个静态类型,可以一次性读取一个处理器内核(在所有平台上),那么它就是一个原子操作。如果它是一个较大的类型,需要多个操作来读取或写入,那么它不是原子的,您可以读取作为另一个线程在您读取/写入它时部分更改它的产品的狡猾值。

【讨论】:

  • 原子性无关紧要。这是询问多个线程读取该值。即使读取是单条指令,它仍然会按顺序发生,除非线程运行在不同的内核上。
  • 嗯?如今,跨多核处理器运行非常普遍......
  • 所以你在构造函数中初始化你的静态变量,你确定没有其他线程在之前或期间访问该静态变量吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-31
  • 2011-07-17
  • 2011-06-03
  • 1970-01-01
相关资源
最近更新 更多