標籤:
在Java中寫多線程相關的程式簡單很多,在多線程中需要同步的時候,使用synchronized就行了。
最近學習c的多線程與同步,感覺實現起來,要寫的代碼比較多一些,這也許是因為java封裝的比較好吧。
下面是今天寫的一個例子,主要參考:http://hi.baidu.com/personnel/blog/item/ae87720e8b2f5aea7acbe1c6.html
#include <stdio.h>#include <windows.h>#include <process.h>//關鍵段變數聲明HANDLE g_hThreadEvent;CRITICAL_SECTION g_csThreadCode;int total = 0; //全部變數unsigned int __stdcall threadFun(void *pm){ int v = *(int *)pm; SetEvent(g_hThreadEvent); //觸發事件 Sleep(50); EnterCriticalSection(&g_csThreadCode); //進入子線程互斥地區 total++; printf("thread no:%d,total:%d\n",v,total); LeaveCriticalSection(&g_csThreadCode); //離開子線程互斥地區 return 0;}int main(){ //初始化事件和關鍵段 自動置位,初始無觸發的匿名事件 g_hThreadEvent = CreateEvent(NULL, FALSE, FALSE, NULL); //關鍵段初始化 InitializeCriticalSection(&g_csThreadCode); int i; int THREAD_NUM = 10; //子線程數 HANDLE handle[THREAD_NUM]; for(i=0;i<THREAD_NUM;i++) { handle[i] = _beginthreadex(NULL,0,threadFun,&i,0,NULL); WaitForSingleObject(g_hThreadEvent, INFINITE); //等待事件被觸發,這裡必須 } WaitForMultipleObjects(THREAD_NUM, handle, TRUE, INFINITE); //用完之後記得銷毀 CloseHandle(g_hThreadEvent); DeleteCriticalSection(&g_csThreadCode); return 0;}
運行結果:
這個例子主要測試兩點:
1. 主線程與子線程的同步,使用事件(Event),參考:http://blog.csdn.net/morewindows/article/details/7445233
2. 各子線程間的同步,使用關鍵段(CRITICAL_SECTION),參考:http://blog.csdn.net/morewindows/article/details/7442639
另註:
實現主線程與子線程的同步,有幾種方式:事件(Event)、訊號量(Semaphore)。
實現子線程的同步,有幾種方式,比如:關鍵段(CRITICAL_SECTION),互斥量(Mutex)。
關於子線程間的兩種同步方式的對比,參見:http://hi.baidu.com/personnel/blog/item/fd4a7609ffba398f2fddd436.html
2012-05-13
試著用c寫了一個多線程的同步