该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