該x值是一些挑戰什麼是加載和存儲
在單處理器系統,其中,加載和存儲被認爲是 原子,什麼是對於x兩個線程後所有可能的值有假設x被初始化爲O,在 以下執行完成。提示:您需要 考慮如何將此代碼編譯爲機器語言。
for(int i = 0; i < 5; i ++): x = x + 1; (int j = 0; j < 5; j ++): x = x + 1;
該x值是一些挑戰什麼是加載和存儲
在單處理器系統,其中,加載和存儲被認爲是 原子,什麼是對於x兩個線程後所有可能的值有假設x被初始化爲O,在 以下執行完成。提示:您需要 考慮如何將此代碼編譯爲機器語言。
for(int i = 0; i < 5; i ++): x = x + 1; (int j = 0; j < 5; j ++): x = x + 1;
好,最體面的編譯器會優化,爲x=10;
嗯,10賜教否則。
你的問題中的每一行代表一個單獨的線程。由於共享變量x
沒有被保護,幾乎任何事情都可能發生。你有什麼可能性? (否則我會覺得我只是回答你的問題你)
第二提示:讓你一個C編譯器幫助您展示一些例子...
int x;
void f(void)
{
int i;
for (i = 0; i < 5; i++) x = x + 1;
}
(這是你的程序翻譯進入C)
gcc -S -fno-PIC t.c
(這是我要在我的機器上輸入獲得可讀的彙編)
_f:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
movl $0, -12(%ebp)
jmp L2
L3:
movl _x, %eax
incl %eax
movl %eax, _x
leal -12(%ebp), %eax
incl (%eax)
L2:
cmpl $4, -12(%ebp)
jle L3
leave
ret
現在與優化(新增選項-02到編輯):
_f:
movl _x, %eax
xorl %edx, %edx
pushl %ebp
movl %esp, %ebp
.align 4,0x90
L2:
incl %edx
incl %eax
cmpl $5, %edx
jne L2
movl %eax, _x
leave
ret
應該已經評論了 – Nifle 2010-04-27 21:19:17
還是沒有線索.......... – Kevinniceguy 2010-04-27 21:33:32
提示:你不需要考慮所有可能的序列,你只需要考慮最極端的情況。 x可能是什麼最小值? x可能的最大值是多少?
當一個線程的加載總是發生在加載之後和另一個線程中的存儲之前時,會發生最小情況。
當不存在重疊的加載 - 修改 - 存儲序列時將發生最大情況。
這應該是足夠的提示,你現在就可以解決它。
我會爭辯說load r,x; R = R + 42; store x,r;負載r,x; R = R-37; store x,r;對於編譯器提供的信息之一是一個正確的編譯線程,它給出的結果高於你正在考慮的「最大情況」,但這是純粹的挑剔。 – 2010-04-27 21:42:16
如果語言是C,'x'是'volatile'變量,那麼我會同意非重疊序列給出'x'的最大結果。 – 2010-04-27 21:47:17
@帕斯卡爾:是的,但在新手級作業問題的背景下,我認爲最好保持簡單。 – 2010-04-27 21:48:40
每個線程將具有5臺的操作的指令:
LOAD X
INCREMENT X
STORE X
每個指令的CPU可以選擇得到執行,有兩種另一個線程之後。
是什麼原因?你是怎麼得到的? – Kevinniceguy 2010-04-27 21:09:36