C 多執行緒開發技巧 3

2021-06-13 17:44:39 字數 1538 閱讀 2192

新的問題

保護原則的正確性已經驗證,但是在實現時,我們發現了兩個新問題。

第乙個是剛才的實現中,似乎打破了我們以前說的對稱原則,仔細看**會發現在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...