【问题标题】:What are exactly memory read write operations of the prossesor处理器的内存读写操作到底是什么
【发布时间】:2013-10-11 12:48:21
【问题描述】:

我确定我的头衔并不完美,所以让我澄清一下自己。

本文作者:http://msdn.microsoft.com/en-us/magazine/jj863136.aspx

void Print()
 {
  int d = _data;     // Read 1
  if (_initialized)  // Read 2
    Console.WriteLine(d);
  else
    Console.WriteLine("Not initialized");
}

为什么 Read 1 只算读而不算写?我的意思是,最后将“_data”内容写入“d”。

我希望你明白我在问什么。

【问题讨论】:

    标签: cpu-cache


    【解决方案1】:

    int d = _data; 确实是一个读和一个写。但是写入的是本地的堆栈上的变量d,并且对那里的讨论不感兴趣。

    当有多个线程访问同一个对象并因此访问同一个内存时,我们感兴趣的是成员变量_data 的读/写顺序。对于本地的d 变量,每个线程都有自己的堆栈,在这些示例中访问d 不存在多线程问题。

    本文讨论的是_data 变量,而不是d 变量。每当有人读/写_data 时,这就是有趣的部分,因为这是关于多线程的内存重新排序是必须注意的。 int d = _data 也写信给d 是完全不相关的。

    // Read 1 的评论暗示我们正在谈论 _data - 在该行代码中没有写给 _data

    【讨论】:

    • 根据文章这只是一个内存读取操作。我还是不明白为什么?
    • 因为对d的写入与文章讨论的内容完全无关。
    • 这样,如果我错了,请纠正我,作为局部变量的内存读取计数会获得任何类型的值(数字、字符、另一个变量)。并且内存写入计数为写入到线程共享内存位置的任何类型的值(数字、字符、另一个变量)。
    • @StavAlfi 否。读取意味着系统必须在某处读取内存位置。写入意味着它必须在某处写入内存位置。如果你做a = b,系统需要从b读取,因为它需要获取b的值。一旦它读取了b 的值,它就会将该值写入a。如果你做a = 5,它通常会被认为只写给a,因为5已经是一个值。这与多线程无关。但是文章讨论了当有线程共享内存时会发生什么,为此,只有读/写共享变量的部分才有意义
    猜你喜欢
    • 1970-01-01
    • 2018-03-24
    • 2011-11-26
    • 1970-01-01
    • 2021-11-12
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    相关资源
    最近更新 更多