|
VC windows api 多線程---互斥量 互斥量的用途和臨界區(qū)很像。它與臨界區(qū)的差別在于可以跨線程使用,可以用來(lái)同步進(jìn)行多個(gè)線程間的數(shù)據(jù)訪問(wèn),但是是以犧牲速度為代價(jià)的。只有臨界區(qū)是非核心對(duì)象,那么互斥量就是一個(gè)核心對(duì)象了。核心對(duì)象的特點(diǎn)是有所謂的引用計(jì)數(shù)。所著一個(gè)未被擁有的互斥量,比鎖住一個(gè)未被擁有的臨界區(qū)需要花費(fèi)幾乎100倍的時(shí)間(數(shù)據(jù)引用自《Visual C++ 6.0編程學(xué)習(xí)捷徑》)。
打開互斥量. 釋放互斥量. ------------------------------------------- #define typedef struct THREADDATA
char * str; DWORD WINAPI ThreadProc( LPVOID lpParam ) int main(int argc, char* argv[]) VC windows api 多線程---信號(hào)量信號(hào)量(Semaphore)和互斥量一樣,屬于內(nèi)核對(duì)象。它自動(dòng)執(zhí)行可用資源查詢的測(cè)試,如果有可用資源,則可用資源的計(jì)數(shù)減少,從而避免其它線程請(qǐng)求資源。當(dāng)該線程釋放該資源后,可用資源計(jì)數(shù)增加,則操作系統(tǒng)允許另一個(gè)線程請(qǐng)求資源。 信號(hào)量與臨界區(qū)和互斥量的不同在于,它不能被認(rèn)為屬于某個(gè)線程。也就是說(shuō),一個(gè)線程可以等待信號(hào)量對(duì)象(減少它的資源計(jì)數(shù)),而另一個(gè)線程釋放該對(duì)象(增加它的資源計(jì)數(shù))。 Win32 API提供了幾個(gè)函數(shù)用于支持信號(hào)量。使用Win32 API產(chǎn)生一個(gè)信號(hào)量,必須首先調(diào)用CreateSemaphore()函數(shù),該函數(shù)描述如下: 創(chuàng)建一個(gè)信號(hào)量 你可以根據(jù)信號(hào)量的字符串名字得到該信號(hào)量的句柄: 釋放信號(hào)量函數(shù):
#include "stdafx.h" #define typedef struct THREADDATA
DWORD WINAPI ThreadProc( LPVOID lpParam ) int main(int argc, char* argv[]) 在有幾個(gè)線程并行運(yùn)行的環(huán)境中,同步不同線程的活動(dòng)是非常重要的。一般說(shuō)來(lái),一個(gè)線程使自己與另一個(gè)線程同步的方法是讓自己睡眠。但線程睡眠時(shí),操作系統(tǒng)不再為它調(diào)度CPU時(shí)間,因此它停止了執(zhí)行。不過(guò),就在它睡眠之前,它告訴系統(tǒng)要讓它恢復(fù)執(zhí)行,必須有什么“特殊事件”發(fā)生。操作系統(tǒng)記住該線程的請(qǐng)求,監(jiān)視著“特殊事件”是否發(fā)生以及何時(shí)發(fā)生。當(dāng)它發(fā)生時(shí),線程才又能夠加入到CPU時(shí)間等待隊(duì)列中。一旦被預(yù)訂,線程就能繼續(xù)執(zhí)行了。此時(shí),線程就將它的執(zhí)行與時(shí)間的發(fā)生取得了同步。 void InitializeCriticalSectio ---------------------------------------------- #include "stdafx.h" #define typedef struct THREADDATA CRITICAL_SECTION sec1; char * str; DWORD WINAPI ThreadProc( LPVOID lpParam ) int main(int argc, char* argv[]) |
|
|