来自ThreadPool的线程可能会看到一个陈旧的(处理器缓存的)值

本文关键字:一个 处理器 缓存 陈旧 线程 ThreadPool 来自 | 更新日期: 2023-09-27 18:16:23

当使用。net ThreadPool时,可以保证在线程中执行的操作先于使用ThreadPool。QueueUserWorkItem方法发生-在其执行开始之前?

例如:

class MyClass {
  int my_var_;
  public void Start() {
    ThreadPool.QueueUserWorkItem(Work);
  }
  public void Work() {
    my_var_ = 10;
    ThreadPool.QueueUserWorkItem(Work2);
  }
  public void Work2(object obj) {
    my_var_ = 20;
    ThreadPool.QueueUserWorkItem(Work3);
  }
  public void Work3(object obj) {
    Console.WriteLine(my_var_);
  }
}

假设已经执行了Work方法的同一个线程执行了Work3方法,有可能将值"10"打印到控制台?

来自ThreadPool的线程可能会看到一个陈旧的(处理器缓存的)值

当使用。net线程池时,有一些保证在使用ThreadPool之前在线程中执行。QueueUserWorkItem方法发生-在其执行开始之前?

是的。就像Hans已经说过的那样,任何会导致代码在另一个线程中执行的操作都会在启动器上创建一个内存屏障,这样写就会被提交,而在目标上则会被刷新。如果不这样做,我们将非常不幸。

假设同一个线程已经执行了Work方法执行Work3方法时,值"10"可能是打印到控制台?

。没有将10写入控制台的执行路径。事实上,在当前设置的方式中,确实很少(或根本没有)并行性或交错执行。所以Console.WriteLine必须在赋值my_var_ = 20之后执行。由于写入将在Work3开始之前提交(可能在另一个线程中),读取将返回最新的更改。

相关文章: