今天 看到一道百度筆試題
以下多線程對int型變量x的操作,哪幾個需要進行同步:
A. x=y; B. x++; C. ++x; D. x=1;
最初有人說選B 因為操作了2個寄存器。答案: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都對2個寄存器進行操作。
下表是一個多線程加鎖的規(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++;”,需要對它加鎖是因為它表面上雖然只有一條語句,卻要執(zhí)行至少兩個操作,一是讀出i的初始, 二是把加一后的結(jié)果寫回去,兩個操作就沒有“原子性”了,所以需要加鎖.
文章出處:飛諾網(wǎng)(www.firnow.com):http://dev.firnow.com/course/3_program/c++/cppjs/2008717/133440.html