關于多線程同步的問題
今天 看到一道百度筆試題
以下多線程對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個寄存器進行操作。
下表是一個多線程加鎖的規律表
操作的結果與初值無關 | 操作的結果與初值相關 | |
寫簡單數據類型 | 不需要加鎖① | 需要加鎖② |
寫復雜數據類型 | 需要加鎖③ | 需要加鎖④ |
讀簡單數據類型 | 不需要加鎖⑤ | 不需要加鎖⑥ |
讀復雜數據類型 | 需要加鎖⑦ | 需要加鎖⑧ |
寫簡單數據類型 不需要加鎖① 需要加鎖②
寫復雜數據類型 需要加鎖③ 需要加鎖④
讀簡單數據類型 不需要加鎖⑤ 不需要加鎖⑥
讀復雜數據類型 需要加鎖⑦ 需要加鎖⑧
可以同樣看到ABC都是寫簡單數據類型 并且操作的結果與初值相關。所以需要加鎖。即要求同步
文章出處:飛諾網(www.firnow.com):http://dev.firnow.com/course/3_program/c++/cppjs/2008717/133440.html
可以同樣看到ABC都是寫簡單數據類型 并且操作的結果與初值相關。所以需要加鎖。即要求同步
第2種情況的典型代表是“i++;”,需要對它加鎖是因為它表面上雖然只有一條語句,卻要執行至少兩個操作,一是讀出i的初始, 二是把加一后的結果寫回去,兩個操作就沒有“原子性”了,所以需要加鎖.
文章出處:飛諾網(www.firnow.com):http://dev.firnow.com/course/3_program/c++/cppjs/2008717/133440.html
posted on 2011-01-21 13:33 葉子 閱讀(2099) 評論(0) 編輯 收藏 引用 所屬分類: C\C++