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