今天 看到一道百度筆試題
以下多線程對(duì)int型變量x的操作,哪幾個(gè)需要進(jìn)行同步:
A. x=y; B. x++; C. ++x; D. x=1;
最初有人說選B 因?yàn)椴僮髁?個(gè)寄存器。答案:ABC
后面干脆將代碼匯編了。
得到
x = y;
00411A25 mov eax,dword ptr [y]
00411A28 mov dword ptr [x],eax
x++;
00411A2B mov eax,dword ptr [x]
00411A2E add eax,1
00411A31 mov dword ptr [x],eax
++x;
00411A34 mov eax,dword ptr [x]
00411A37 add eax,1
00411A3A mov dword ptr [x],eax
x = 1;
00411A3D mov dword ptr [x],1
我們看到ABC都對(duì)2個(gè)寄存器進(jìn)行操作。
下表是一個(gè)多線程加鎖的規(guī)律表
|
操作的結(jié)果與初值無關(guān) |
操作的結(jié)果與初值相關(guān) |
| 寫簡單數(shù)據(jù)類型 |
不需要加鎖① |
需要加鎖② |
| 寫復(fù)雜數(shù)據(jù)類型 |
需要加鎖③ |
需要加鎖④ |
| 讀簡單數(shù)據(jù)類型 |
不需要加鎖⑤ |
不需要加鎖⑥ |
| 讀復(fù)雜數(shù)據(jù)類型 |
需要加鎖⑦ |
需要加鎖⑧ |
寫簡單數(shù)據(jù)類型 不需要加鎖① 需要加鎖②
寫復(fù)雜數(shù)據(jù)類型 需要加鎖③ 需要加鎖④
讀簡單數(shù)據(jù)類型 不需要加鎖⑤ 不需要加鎖⑥
讀復(fù)雜數(shù)據(jù)類型 需要加鎖⑦ 需要加鎖⑧
可以同樣看到ABC都是寫簡單數(shù)據(jù)類型 并且操作的結(jié)果與初值相關(guān)。所以需要加鎖。即要求同步
文章出處:飛諾網(wǎng)(www.firnow.com):http://dev.firnow.com/course/3_program/c++/cppjs/2008717/133440.html
可以同樣看到ABC都是寫簡單數(shù)據(jù)類型 并且操作的結(jié)果與初值相關(guān)。所以需要加鎖。即要求同步
第2種情況的典型代表是“i++;”,需要對(duì)它加鎖是因?yàn)樗砻嫔想m然只有一條語句,卻要執(zhí)行至少兩個(gè)操作,一是讀出i的初始, 二是把加一后的結(jié)果寫回去,兩個(gè)操作就沒有“原子性”了,所以需要加鎖.
文章出處:飛諾網(wǎng)(www.firnow.com):http://dev.firnow.com/course/3_program/c++/cppjs/2008717/133440.html