看個打破保護原則的例子
#include
#include
static dword winapi mythread( lpvoidlpparam );
static int num = 20;
int main(int argc, char *argv)
handlehthread[4];
inti;
for( i=0; i<4; i++ )
hthread[i]= createthread(null, 0, mythread, (lpvoid)i, 0, 0);
for( i=0; i<4; i++ )
waitforsingleobject(hthread[i],infinite);
return0;
dword winapi mythread( lpvoid lpparam )
intindex = (int)lpparam;
printf("id:%d\n", index);
while(1)
if(num>0)
printf("[id:%d]num = %d\n", index, num);
sleep(1);
printf("[id:%d]num = %d\n", index, num--);
}else
break;
return0;
這個程式中,變數 num 就是乙個被多個執行緒共同訪問的資料,因為 num 沒有被保護,因此,程式輸出和預期的會不一樣。並且,如果修改 sleep(1) 中的休眠時間,程式輸出又會不同。同樣,如果程式在不同的機器上跑,輸出也會不一樣。造成這種現象的原因就在於,這個程式打破了我們說的執行緒間共享資料需要被保護的原則。
把 num 用互斥量保護起來以後,bug就被修復了。
#include
#include
#include "..\..\port\port.h"
static dword winapi mythread( lpvoidlpparam );
static hmutex hmutex;
static int num = 20;
static int modify(int index);
int main(int argc, char *argv)
handlehthread[4];
inti;
hmutex= mutex_create();
if(hmutex==null)
return-1;
for( i=0; i<4; i++ )
hthread[i]= createthread(null, 0, mythread, (lpvoid)i, 0, 0);
for( i=0; i<4; i++ )
waitforsingleobject(hthread[i],infinite);
mutex_destroy(hmutex);
return0;
dword winapi mythread( lpvoid lpparam )
intindex = (int)lpparam;
printf("id:%d\n", index);
while(1)
if(modify(index)!=0)
break;
return0;
static int modify(int index)
mutex_lock(hmutex);
if(num>0)
printf("[id:%d]num = %d\n", index, num);
sleep(100);
printf("[id:%d]num = %d\n", index, num--);
}else
mutex_unlock(hmutex);
return-1;
mutex_unlock(hmutex);
return0;
這個程式要被編譯,需要port.h標頭檔案,這個標頭檔案是為了多執行緒程式跨平台而封裝的介面檔案。
C 多執行緒開發技巧 3
新的問題 保護原則的正確性已經驗證,但是在實現時,我們發現了兩個新問題。第乙個是剛才的實現中,似乎打破了我們以前說的對稱原則,仔細看 會發現在modify 函式中,mutex lock 被呼叫了一次,而mutex unlock 卻被呼叫了2次。這個問題雖然是個小問題,但是對於完美主義的我而言,卻是個...
C 多執行緒開發技巧 5
新的問題 最常見的處理方式 超級類解決一切 我們知道,主線程是不需要建立的,而涉及到ui的開發中,總存在乙個主視窗的視窗類,這個視窗類中包含了所有的ui控制項,同時處理所有使用者操作的視窗訊息。對於業務執行緒的處理,最常見的是在主視窗類中建立,同時,業務執行緒涉及到的業務邏輯處理類如網路互動 解碼和...
c 多執行緒2
for int i 0 i 100000 i 這麼一段 放在程式裡的那簡直頁面會卡出蛇精病,怎麼辦呢,用多執行緒試試 private void button1 click object sender,eventargs e private void er 頁面 呵呵呵,愚蠢人類,卡死你了吧。窩 媽蛋...