对于线程与锁的一个问题,希望大虾们不吝赐教。 Class Sample {
int a=1,b=2;
void hither(){
a = b;
} void yon() {
b = a;
}
} 有2个线程分别调用hither() 和yon(),则对主存的操作可能性是以下三种 (h,y,m 分别代表了线程的存储和主存):
1) write a-> read a. read b -> write b (ha=2,hb=2,ma=2,mb=2,ya=2,yb=2)
2) read a-> write a. write b->read b (ha=1,hb=1ma=1,mb=1,ya=1,yb=1)
3) read a-> write a. read b->write b. (ha=2,hb=2,ma=2,mb=1,ya=1,yb=1) 我觉得好像步骤少了一些 。(h,y 代表相关线程的store,load相对的主存操作)
1) read hb -> write ha ->read ya ->write yb
但是 第2)3)种情况我就不明白了,希望能够指出,谢谢
int a=1,b=2;
void hither(){
a = b;
} void yon() {
b = a;
}
} 有2个线程分别调用hither() 和yon(),则对主存的操作可能性是以下三种 (h,y,m 分别代表了线程的存储和主存):
1) write a-> read a. read b -> write b (ha=2,hb=2,ma=2,mb=2,ya=2,yb=2)
2) read a-> write a. write b->read b (ha=1,hb=1ma=1,mb=1,ya=1,yb=1)
3) read a-> write a. read b->write b. (ha=2,hb=2,ma=2,mb=1,ya=1,yb=1) 我觉得好像步骤少了一些 。(h,y 代表相关线程的store,load相对的主存操作)
1) read hb -> write ha ->read ya ->write yb
但是 第2)3)种情况我就不明白了,希望能够指出,谢谢
执行完 hither 再执行 yon;
第二种:
执行完 yon 再执行 hither;第三种:(也就是问题所在)
a = b 分成两个步骤(可中断),读入(至 CPU) b,然后写出(至内存)a,b = a 同理。
因为是两个线程同时执行,可能是这样的顺序:
hither 的读入 b,这时候 b 为 2;
yon 的读入 a,这时候 a 为 1;
hither 的写出 a,2;
yon 的 写出 b,1;
实现了一个 swap :-)