新的問題
保護原則的正確性已經驗證,但是在實現時,我們發現了兩個新問題。
第乙個是剛才的實現中,似乎打破了我們以前說的對稱原則,仔細看**會發現在modify 函式中,mutex_lock 被呼叫了一次,而mutex_unlock 卻被呼叫了2次。這個問題雖然是個小問題,但是對於完美主義的我而言,卻是個大問題。當然,在培訓的實踐中,也確實發現部分學員很容易忘記第乙個mutex_unlock 的呼叫,這當然會產生程式的bug。好的程式總是優美的,並且總是簡明的,可是,在modify 函式中,因為保護原則,我們看不到**的優美和簡明。
第二個問題是在乙個大的多執行緒程式中,如果要對每個共享資料都進行保護,那也許我們需要的互斥量有點過於多了,以至於程式可讀性會變得很差,mutex_lock、mutex_unlock 到處都是。很多程式設計師正是因為實現上的繁瑣,所以才會在**中打破保護原則,而一旦保護原則被打破,則程式的 bug 也將隨之而來,這真是很難辦的事情。
cguard 類
cguard類是專門為解決上述第乙個問題而設計和實現的類,並且,這個類的使用也非常方便。下面看一下使用 cguard 類改造後的程式。
#include
#include
#include "..\..\port\port.h"
#include "..\..\port\mutex.h"
#include "..\..\port\guard.h"
static dword winapi mythread( lpvoidlpparam );
static cmutex mutex;
static int num = 20;
static int modify(int index);
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(modify(index)!=0)
break;
return0;
static int modify(int index)
cguardguard(mutex);
if(num>0)
printf("[id:%d]num = %d\n", index, num);
sleep(100);
printf("[id:%d]num = %d\n", index, num--);
}else
return-1;
return0;
C 多執行緒開發技巧 2
看個打破保護原則的例子 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 ...
C 多執行緒開發技巧 5
新的問題 最常見的處理方式 超級類解決一切 我們知道,主線程是不需要建立的,而涉及到ui的開發中,總存在乙個主視窗的視窗類,這個視窗類中包含了所有的ui控制項,同時處理所有使用者操作的視窗訊息。對於業務執行緒的處理,最常見的是在主視窗類中建立,同時,業務執行緒涉及到的業務邏輯處理類如網路互動 解碼和...
多執行緒開發
本文章 感覺蕭蕭空間分享。前不久寫了乙個專案,其中需要處理大量的資料,這些資料都是記錄型的,對這些資料進行處理是乙個非常耗時的事情,net在處理這些使用的過程中,就好像宕機一樣一動不動。這樣給使用者的感覺非常的不好。例如如下的例子,我們在乙個窗體上放置乙個progressbar,然後對progres...