2013-03-20 63 views
0

我的問題的範圍嚴格限於在內存中同時讀取和寫入地址,以及硬件中發生的情況。從不同線程讀取和寫入相同變量時的硬件狀態

我對通過在比賽發生時使用值繼續執行程序後知道有關競賽狀況和可能攜帶的內容不感興趣。如果一個電腦的邏輯被破壞了,是的,它們也可能會導致崩潰,但是在這裏我的問題嚴格來說是關於硬件以及來自併發線程的WRITE + READ的影響。

問題:假設我從一個線程寫入變量,並從另一個線程讀取同一個變量。會發生什麼?

  1. 只是腐敗的變量的值,使所有以下螺紋將讀取 一個錯誤的值,由於該讀的交織/寫?

    在某些情況下
  1. ,也可導致應用程序走下來,因爲這可能是在某些情況下,某種違反硬件。

本質上我想知道更多關於物理讀寫的過程,同時變量和PC的行爲。

我使用LINUX和C++和我對2案件

  • 2個線程在相同的物理核心

  • 2個線程上2個獨立的芯

+0

什麼平臺?什麼大小變量?您是在談論在單獨的物理核心上運行的線程還是在同一個核心上運行的線程? – 2013-03-20 00:27:52

+0

我正在使用LINUX和C++,並在具體的我感興趣的2例。 A.Thread在同一個核心。 B.分開核心線程。數據是C++ bools,整數和double。 – 2013-03-20 00:30:40

+1

嗯,運行在同一物理內核上的兩個線程**不能同時訪問內存,因爲它們不能同時運行;) – 2013-03-20 00:31:43

回答

1

它全部取決於什麼樣的硬件和變量的大小。訪問整數通常是原子的,但訪問雙打通常不是。即使對於簡單的小值,不同的硬件可能會有非常不同的行爲您需要獲得硬件手冊的副本。這裏有一篇文章討論了這方面的一些內容:Does one assembler instruction always execute atomically?

讀取不會改變寫入的行爲,除非硬件設計不好,但如果讀取看到部分寫入,寫入會導致讀取的值不正確但其餘的不是。

+1

即使對於多字操作,最糟糕的情況是讀取一個損壞的值, 對?我認爲只有通過寄存器間接地址這個不正確的值可能會導致內存違規。 – 2013-03-20 00:52:54

+0

@arodas是的,我同意。 – 2013-03-20 01:20:18

+0

@Thank Peter。我明白了,我需要確認你的迴應的最後部分:假設發生一次由於併發寫入而導致讀取的值不正確。在該變量的NEXT讀取(沒有併發寫入)時會發生什麼?第一次讀取被併發寫入損壞,但第二次讀取會返回正確的變量?據我的理解,寫入行爲不會被寫入改變(如果有兩個併發寫入,情況就不會這樣)。 – 2013-03-20 08:52:28