C 多執行緒開發技巧 2

2021-06-13 17:40:22 字數 2030 閱讀 1820

看個打破保護原則的例子

#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 頁面 呵呵呵,愚蠢人類,卡死你了吧。窩 媽蛋...