这是一些挑战
在单处理器系统上,假定加载和存储 原子,两个线程完成后,x的所有可能值是什么 假设x初始化为O,以下执行?提示:你需要 考虑如何将此代码编译成机器语言。
for(int i = 0; i< 5; i ++): x = x + 1;
for(int j = 0; j <5; j ++): x = x + 1;
答案 0 :(得分:1)
您问题中的两行中的每一行都代表一个单独的主题。由于共享变量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
现在进行优化(在编译中添加选项-O2):
_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
答案 1 :(得分:0)
提示:您不需要考虑所有可能的序列,您只需要考虑最极端的情况。 x可能的最小值是多少? x可能的最大值是多少?
当一个线程的加载总是在加载之后和另一个线程中的存储之前发生时,将发生最小情况。
当没有重叠的加载 - 修改 - 存储序列时,将发生最大情况。
这应该足以让你现在解决这个问题。
答案 2 :(得分:0)
每个帖子将有5套说明:
LOAD X
INCREMENT X
STORE X
在每条指令之后,CPU可以选择执行两个另一个线程。
答案 3 :(得分:-1)
好吧,大多数不错的编译器会将其优化为x=10;
答案 4 :(得分:-1)