C++ 線程同步 (學習筆記)

來源:互聯網
上載者:User

1. 利用Mutex 互斥對象

#include <iostream.h><br />#include <windows.h><br />DWORD WINAPI Fun1Proc(<br />LPVOID lpParameter<br />);<br />DWORD WINAPI Fun2Proc(<br /> LPVOID lpParameter<br />);<br />int tickets = 100;<br />HANDLE hMutex; //互斥對象<br />int main()<br />{<br />HANDLE hThread1,hThread2;<br />hThread1 = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);<br />hThread2 = CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);<br /> CloseHandle(hThread1);<br />CloseHandle(hThread2);<br />hMutex = CreateMutex(NULL,FALSE,NULL);</p><p>Sleep(8000);<br />return 1;<br />}<br />DWORD WINAPI Fun1Proc(<br /> LPVOID lpParameter<br />)<br />{<br />while (TRUE){<br />WaitForSingleObject(hMutex,INFINITE); //有訊號時才返回<br />if(0 == tickets)<br />break;<br />cout<<"Thread1 sell tickets "<<tickets--<<endl;<br />ReleaseMutex(hMutex);//釋放互斥對象<br />}<br />return 0;<br />}<br />DWORD WINAPI Fun2Proc(<br /> LPVOID lpParameter<br />)<br />{<br />while (TRUE){<br />WaitForSingleObject(hMutex,INFINITE);<br />if(0 == tickets)<br />break;<br />cout<<"Thread2 sell tickets "<<tickets--<<endl;<br />ReleaseMutex(hMutex);//釋放互斥對象<br />}<br />return 0;<br />}

 

2. 利用Event 事件對象

#include <iostream.h><br />#include <windows.h><br />DWORD WINAPI Fun1Proc(<br />LPVOID lpParameter<br />);<br />DWORD WINAPI Fun2Proc(<br /> LPVOID lpParameter<br />);<br />int tickets = 100;<br />HANDLE hEvent; //事件<br />int main()<br />{<br />hEvent = CreateEvent(NULL,FALSE,FALSE,NULL); //建立事件<br />SetEvent(hEvent);//設定成有訊號狀態<br />HANDLE hThread1,hThread2;<br />hThread1 = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);<br />hThread2 = CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);<br /> CloseHandle(hThread1);<br />CloseHandle(hThread2);</p><p>Sleep(8000);<br />return 1;<br />}<br />DWORD WINAPI Fun1Proc(<br /> LPVOID lpParameter<br />)<br />{<br />while (TRUE){<br />WaitForSingleObject(hEvent,INFINITE); //事件有訊號才返回<br />ResetEvent(hEvent); //設成無訊號,以免其餘線程訪問<br />if(0 == tickets)<br />break;<br />cout<<"Thread1 sell tickets "<<tickets--<<endl;<br />SetEvent(hEvent);//設為有訊號,以供其餘線程調用<br />}<br />return 0;<br />}<br />DWORD WINAPI Fun2Proc(<br /> LPVOID lpParameter<br />)<br />{<br />while (TRUE){<br />WaitForSingleObject(hEvent,INFINITE); //事件有訊號才返回<br />ResetEvent(hEvent); //設成無訊號,以免其餘線程訪問<br />if(0 == tickets)<br />break;<br />cout<<"Thread2 sell tickets "<<tickets--<<endl;<br />SetEvent(hEvent);//設為有訊號,以供其餘線程調用<br />}<br />return 0;<br />}

 

3. 利用臨界區 CRITICAL_SECTION 效率更高

#include <iostream.h><br />#include <windows.h></p><p>DWORD WINAPI Fun1Proc(<br />LPVOID lpParameter<br />);<br />DWORD WINAPI Fun2Proc(<br /> LPVOID lpParameter<br />);</p><p>int tickets = 100;<br />CRITICAL_SECTION cs;//臨界區<br />int main()<br />{<br />InitializeCriticalSection(&cs); //初始化臨界區</p><p>HANDLE hThread1,hThread2;<br />hThread1 = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);<br />hThread2 = CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);<br /> CloseHandle(hThread1);<br />CloseHandle(hThread2);</p><p>Sleep(8000);<br />return 1;<br />}</p><p>DWORD WINAPI Fun1Proc(<br /> LPVOID lpParameter<br />)<br />{<br />while (TRUE){<br />EnterCriticalSection(&cs); //進入臨界區</p><p>if(0 == tickets)<br />break;<br />cout<<"Thread1 sell tickets "<<tickets--<<endl;</p><p>LeaveCriticalSection(&cs); //離開臨界區<br />}<br />return 0;<br />}<br />DWORD WINAPI Fun2Proc(<br /> LPVOID lpParameter<br />)<br />{<br />while (TRUE){<br />EnterCriticalSection(&cs); //進入臨界區</p><p>if(0 == tickets)<br />break;<br />cout<<"Thread2 sell tickets "<<tickets--<<endl;</p><p>LeaveCriticalSection(&cs); //離開臨界區<br />}<br />return 0;<br />}

 

 4. 利用Semaphore訊號量

/** FileName: Semaphore_Test.cpp * Author:   JarvisChu* Date:     2012-11-22*///#include <iostream>#include <iostream>#include <windows.h>using namespace std;DWORD WINAPI Fun1Proc(LPVOID lpParameter);DWORD WINAPI Fun2Proc(LPVOID lpParameter);DWORD WINAPI Fun3Proc(LPVOID lpParameter);volatile int tickets = 100;HANDLE hSemaphore;int main(){//必須先Create Semaphore 然後CreateThreadhSemaphore = CreateSemaphore(NULL,1,//初始資源數 互斥的情況下必須為1 3,//最大資源數,互斥的情況下意義不大NULL    //Unnameed semaphore);if(hSemaphore == NULL) cout<<"Create Semaphore Failed!"<<endl;HANDLE hThread1,hThread2,hThread3;hThread1 = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);hThread2 = CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);hThread3 = CreateThread(NULL,0,Fun3Proc,NULL,0,NULL);CloseHandle(hThread1);CloseHandle(hThread2);CloseHandle(hThread3);Sleep(800);return 0;}DWORD WINAPI Fun1Proc(LPVOID lpParameter){while (TRUE){DWORD nWaitResult;nWaitResult = WaitForSingleObject(hSemaphore,INFINITE);if(tickets >0)cout<<"Thread1 Sailed ticket "<<tickets--<<endl;elsebreak;ReleaseSemaphore(hSemaphore,1,NULL);}return 0;}DWORD WINAPI Fun2Proc(LPVOID lpParameter){while (TRUE){DWORD nWaitResult;nWaitResult = WaitForSingleObject(hSemaphore,INFINITE);if(tickets >0)cout<<"Thread2 Sailed ticket "<<tickets--<<endl;elsebreak;ReleaseSemaphore(hSemaphore,1,NULL);}return 0;}DWORD WINAPI Fun3Proc(LPVOID lpParameter){while (TRUE){DWORD nWaitResult;nWaitResult = WaitForSingleObject(hSemaphore,INFINITE);if(tickets >0)cout<<"Thread3 Sailed ticket "<<tickets--<<endl;elsebreak;ReleaseSemaphore(hSemaphore,1,NULL);}return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.