關于多線程:
1. C++中,創(chuàng)建線程有SDK的CreateThread,傳遞一個線程函數(shù),它的定義為
DWORD WINAPI funcproc(LPVOID lpParameter)。但我們盡量避免使用單純的C++庫,在VC++中 MFC封裝了CWinThread,我們既可以從CWinThread派生 出自己的線程類,也可以直接使用CWinThread作為宿主類,傳遞線程函數(shù)。線程函數(shù)的定義為UINT ThreadProc(LPVOID lpParam),我們使用AfxBeginThread來創(chuàng)建一個線程,該線程一旦啟動后,將直接進入ThreadProc,而且從該 ThreadProc返回時,線程也將結束。我們設置dwCreateFlags參數(shù)的值為CREATE_SUSPENDED來使線程一創(chuàng)建后,直接掛 起。我們也可以顯式調(diào)用AfxEndThread來結束線程。
- 在多線程開發(fā)中,最主要的麻煩是同步和資源沖突問題,我們考慮以下環(huán)境,有線程讀取一個變量,而另一個線程正在同步刷新該變量,這時 就發(fā)生同步問題。面對一個資源,我們有時需要限制同時訪問該資源的個數(shù)。我們有時只能允許只有一個線程訪問一個資源,例如打印機。我們還有些時候需要讓線 程等待一個信號的出現(xiàn),例如串口采集后臺處理線程。
- CEvent:表示一個“事件”——一個允許一個線程通知另一個線程事件已經(jīng)發(fā)生的同步對象。當應用程序必須等到發(fā)生某事才能訪問資源的時候,我們應該使用這個類。
在一個處理線程中,用CEvent::SetEvent,然后其他類使用CSingleLock::Lock等待。 - CSemaphore:表示一個“信號燈”——一個允許一個或多個進程中的有限多個線程訪問一個資源的同步對象。當限制同一應用程序內(nèi)(1到n個)線程可以同時訪問此資源時,我們應該使用這個類。
CSemaphore semaphore(3,3,”semaphore”);//參數(shù)1:初始資源數(shù);2:最大資源數(shù);3:信號量的名稱.
semaphore.Lock();
semaphore.Unlock();
若已經(jīng)達到最大訪問客戶數(shù),則下一個請求鎖定客戶將會阻塞等待。 - CMutex:表示一個“互斥體”——一個允許一個線程以互相排斥的方式訪問一個資源的同步對象。當可以有一個以上的應用程序使用此資源,使用這個類。
CMutex mutex(FALSE,”MUTEX”);//第一個參數(shù):互斥量初始是鎖定還是未鎖定;第二個參數(shù):互斥量名稱,用于標識.
mutex.Lock();
mutex.Unlock(); - CCriticalSection:表示一個“臨界區(qū)”——一個允許一個線程同時訪問一個資源或代碼段的同步對象。相對與CMutex,則使用這個類,與上面的區(qū)別唯一在于上面可以允許另一個進程使用該資源,兩者相同在于進程內(nèi)線程互斥。
- CMultiLock:表示多線程程序中用于控制對多個資源的訪問的訪問控制機制。若其中有一個資源沒釋放,則等待。
- CSingleLock:表示多線程程序中用于控制對一個資源的訪問的訪問控制機制。CSingleLock singleLock(&m_CritSection);
singleLock.Lock();
singleLock.Unlock();
m_CritSection為同步類,根據(jù)不同的需要采用不同的同步類,如CEvent、CMutex、CCriticalSection。