




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第二章Windows多線程編程1內(nèi)容Windows操作系統(tǒng)的一些基本知識(shí)Win32API線程庫(kù)線程間通信21、Windows操作系統(tǒng)的一些基本知識(shí)API內(nèi)核對(duì)象及句柄3API(ApplicationProgrammingInterface)API操作系統(tǒng)留給應(yīng)用程序的一個(gè)調(diào)用接口,應(yīng)用程序通過(guò)調(diào)用操作系統(tǒng)的API而使操作系統(tǒng)去執(zhí)行應(yīng)用程序的命令(動(dòng)作)。WindowsAPI是一套用來(lái)控制Windows的各個(gè)部件的外觀和行為的預(yù)先定義的Windows函數(shù)。Win32API即為Microsoft32位平臺(tái)的應(yīng)用程序編程接口。Win32平臺(tái)上運(yùn)行的應(yīng)用程序都可以調(diào)用這些函數(shù)。32與64位API函數(shù)聲明上沒(méi)有明顯區(qū)別,但64位編程是需要下載相應(yīng)的平臺(tái)SDK
4API(ApplicationProgrammingInterface)直接用win32API編寫(xiě)的應(yīng)用程序,程序的執(zhí)行代碼小,運(yùn)行效率高M(jìn)FC用類(lèi)庫(kù)的方式將win32API進(jìn)行封裝,以類(lèi)的方式提供給開(kāi)發(fā)者Framework類(lèi)庫(kù)提供了所有應(yīng)用程序模型都要使用的一個(gè)面向?qū)ο蟮腁PI集合5內(nèi)核對(duì)象及句柄當(dāng)應(yīng)用程序要與系統(tǒng)設(shè)備進(jìn)行交互的時(shí)候,將使用到內(nèi)核對(duì)象。出于安全的考慮,進(jìn)程是不能直接訪問(wèn)內(nèi)核對(duì)象的,操作系統(tǒng)提供了對(duì)應(yīng)的函數(shù)來(lái)對(duì)它們進(jìn)行訪問(wèn)。內(nèi)核對(duì)象是由操作系統(tǒng)內(nèi)核分配,只能由內(nèi)核訪問(wèn)的數(shù)據(jù)結(jié)構(gòu),用來(lái)管理各種系統(tǒng)資源。內(nèi)核對(duì)象包括:存取符號(hào)對(duì)象、事件對(duì)象、文件對(duì)象、作業(yè)對(duì)象、互斥對(duì)象、管道對(duì)象、等待計(jì)時(shí)器對(duì)象等都是內(nèi)核對(duì)象。編程時(shí)經(jīng)常要?jiǎng)?chuàng)建、打開(kāi)和操作它們。6內(nèi)核對(duì)象及句柄內(nèi)核對(duì)象由內(nèi)核擁有,各個(gè)進(jìn)程可以共享內(nèi)核對(duì)象。進(jìn)程中止執(zhí)行,它使用的內(nèi)核對(duì)象并不一定會(huì)被撤銷(xiāo)。每個(gè)內(nèi)核對(duì)象都有一個(gè)計(jì)數(shù)器來(lái)存儲(chǔ)有多少個(gè)進(jìn)程在使用它的信息。進(jìn)程調(diào)用時(shí),計(jì)數(shù)器增1,調(diào)用結(jié)束,計(jì)數(shù)器減1。內(nèi)核對(duì)象計(jì)數(shù)器為零時(shí),銷(xiāo)毀此內(nèi)核對(duì)象。
7內(nèi)核對(duì)象及句柄內(nèi)核對(duì)象有安全描述符的保護(hù),安全描述符描述了誰(shuí)創(chuàng)建了該對(duì)象以及誰(shuí)能夠使用該對(duì)象。用于創(chuàng)建內(nèi)核對(duì)象的函數(shù)幾乎都有一個(gè)指向SECURITY_ATTRIBUTES
結(jié)構(gòu)的指針作為其參數(shù)。
大多數(shù)應(yīng)用程序通過(guò)傳NULL值,創(chuàng)建具有默認(rèn)安全性的對(duì)象。如果想限制別人對(duì)對(duì)象的訪問(wèn),就需要單獨(dú)創(chuàng)建一個(gè)SECURITY_ATTRIBUTES對(duì)象并對(duì)其初始化。8內(nèi)核對(duì)象及句柄句柄:創(chuàng)建內(nèi)核對(duì)象時(shí),函數(shù)的返回值,標(biāo)記該內(nèi)核對(duì)象。句柄表:進(jìn)程被初始化時(shí),系統(tǒng)給進(jìn)程分配一個(gè)句柄表,用于保存該進(jìn)程使用的內(nèi)核對(duì)象的信息,而句柄值則是相應(yīng)內(nèi)核對(duì)象在句柄表中的索引值,因此句柄值是進(jìn)程相關(guān)的。9內(nèi)核對(duì)象及句柄內(nèi)核對(duì)象創(chuàng)建當(dāng)利用creat*函數(shù)來(lái)創(chuàng)建內(nèi)核對(duì)象時(shí),調(diào)用該函數(shù)的時(shí)候內(nèi)核就為該對(duì)象分配一個(gè)內(nèi)存塊,并進(jìn)行初始化,然后內(nèi)核再掃描該進(jìn)程的句柄表,初始化一條記錄并放在句柄表中。關(guān)閉內(nèi)核對(duì)象無(wú)論進(jìn)程怎樣創(chuàng)建內(nèi)核對(duì)象,在不使用該對(duì)象的時(shí)候都應(yīng)當(dāng)通過(guò)Bool
CloseHandle(HANDLE
hobj)來(lái)向操作統(tǒng)聲明結(jié)束對(duì)該對(duì)象的訪問(wèn)。10Win32API線程庫(kù)創(chuàng)建線程的基本問(wèn)題創(chuàng)建線程的API函數(shù)操作線程的API一個(gè)簡(jiǎn)單的Windows多線程程序111創(chuàng)建線程的基本問(wèn)題線程可以由進(jìn)程中的任意線程創(chuàng)建,而進(jìn)程的主線程在進(jìn)程加載時(shí)自動(dòng)創(chuàng)建。每個(gè)線程都有自己的進(jìn)入點(diǎn)函數(shù)。主線程的進(jìn)入點(diǎn)函數(shù)進(jìn)入點(diǎn)應(yīng)用程序類(lèi)型WinMain需要ANSI字符和字符串的GUI應(yīng)用程序wWinMain需要Unicode字符和字符串的GUI應(yīng)用程序Main需要ANSI字符和字符串的CUI應(yīng)用程序Wmain需要Unicode字符和字符串的CUI應(yīng)用程序12線程函數(shù)的返回值是該線程的退出代碼線程函數(shù)應(yīng)盡可能使用函數(shù)參數(shù)和局部變量線程函數(shù)----線程的入口點(diǎn)DWORDWINAPIThreadFunc(PVOIDpvParam){ DWORDdwResult=0; … … return(dwResult);}132創(chuàng)建線程的API函數(shù)創(chuàng)建線程:系統(tǒng)創(chuàng)建一個(gè)線程內(nèi)核對(duì)象。線程內(nèi)核對(duì)象不是線程本身,而是操作系統(tǒng)用來(lái)管理線程的較小的數(shù)據(jù)結(jié)構(gòu)在進(jìn)程的地址空間分配內(nèi)存,供線程的堆棧使用14HANDLECreateThread(PSECURITY_ATTRIBUTESpsa,DWORDcbStack,PTHREAD_START_ROUTINEpStartAddr,PVOIDpvParam,DWORDfdwCreate,PDWORDpdwThreadId);2創(chuàng)建線程的API函數(shù)NULL0函數(shù)地址函數(shù)參數(shù)NULL控制創(chuàng)建線程標(biāo)志CREATE_SUSPENDED;0線程ID15暫停線程DWORDSuspendThread(HANDLEhThread)返回值是線程的前一個(gè)暫停計(jì)數(shù)暫停計(jì)數(shù):是線程內(nèi)核對(duì)象的一個(gè)內(nèi)部值。使用要小心,因?yàn)椴恢罆和>€程運(yùn)行時(shí)它在進(jìn)行什么操作??赡茉斐伤梨i3操作線程的API163操作線程的API恢復(fù)線程DWORDResumeThread(HANDLEhThread);返回值是線程的前一個(gè)暫停計(jì)數(shù)該函數(shù)用于將處于暫停狀態(tài)的線程置于就緒狀態(tài),使其參加線程調(diào)度。173操作線程的API使線程睡眠VOIDSleep(DWORDdwMilliseconds);該函數(shù)是線程暫停自己的運(yùn)行,直到睡眠時(shí)間過(guò)去為止當(dāng)線程調(diào)用這個(gè)函數(shù)時(shí),它自動(dòng)放棄剩余的時(shí)間片,迫使系統(tǒng)進(jìn)行線程調(diào)度。Windows不是實(shí)時(shí)的操作系統(tǒng)。183操作線程的API終止線程線程函數(shù)返回(最好)通過(guò)調(diào)用ExitThread函數(shù),線程將自行撤銷(xiāo)同一個(gè)進(jìn)程或另一個(gè)進(jìn)程中的線程調(diào)用TerminateThread函數(shù)包含線程的進(jìn)程終止19線程返回函數(shù)線程中創(chuàng)建的C++類(lèi)對(duì)象能夠正常撤銷(xiāo);操作系統(tǒng)將正確地釋放線程堆棧使用的內(nèi)存;系統(tǒng)將線程的退出代碼設(shè)置為線程函數(shù)的返回值;系統(tǒng)將遞減線程內(nèi)核對(duì)象的使用計(jì)數(shù)。20線程調(diào)用這個(gè)函數(shù),強(qiáng)制線程終止運(yùn)行;操作系統(tǒng)清除該線程使用的所有系統(tǒng)資源。C++類(lèi)對(duì)象將不被撤銷(xiāo)。VOIDExitThread(DWORDdwExitCode);ExitThread函數(shù)21能夠撤銷(xiāo)任何線程;線程的內(nèi)核對(duì)象的使用計(jì)數(shù)也被遞減;異步運(yùn)行的函數(shù);不撤銷(xiāo)線程的堆棧,直到進(jìn)程終止。BOOLTerminateThread(HANDLEhThread,DWORDdwExitCode);TerminateThread函數(shù)22在進(jìn)程終止運(yùn)行時(shí)撤銷(xiāo)線程ExitProcess和TerminateProcess函數(shù)可以終止線程,將會(huì)終止進(jìn)程中的所有線程;ExitProcess只能強(qiáng)制執(zhí)行本進(jìn)程的退出;TerminateProcess在一個(gè)進(jìn)程中強(qiáng)制結(jié)束其他的進(jìn)程;進(jìn)程所使用的資源被清除;C++對(duì)象撤銷(xiāo)函數(shù)沒(méi)有被調(diào)用。VOIDExitProcess(UINTuExitCode);BOOLTerminateProcess(HANDLEhProcess,UINTuExitCode);2324在進(jìn)程終止運(yùn)行時(shí)撤銷(xiāo)線程254一個(gè)簡(jiǎn)單的Windows多線程程序(例1)include"windows.h"#include<iostream>usingnamespacestd;DWORDWINAPIThreadFunc(PVOIDpvParam){ cout<<"Createdthreadsays'helloWorld!'"<<endl; return0;}intmain(){ HANDLEThreadHandle=CreateThread(NULL,0,ThreadFunc,NULL,0,NULL); Sleep(100); cout<<"Mainthreadsays'HelloWorld!"<<endl; getchar(); return0;}26線程間通信操作系統(tǒng)隨機(jī)調(diào)度線程,程序員不能預(yù)知線程的執(zhí)行順序下面兩種情況下,線程間需要通信當(dāng)有多個(gè)線程訪問(wèn)共享資源而不希望共享資源遭到破壞;(互斥)當(dāng)一個(gè)線程需要將某個(gè)任務(wù)已經(jīng)完成的情況通知另外一個(gè)或多個(gè)線程時(shí)。(同步)Windows線程通信方法主要有互鎖函數(shù)、臨界段、事件、互斥量、信號(hào)量27線程間通信互鎖函數(shù)臨界段事件互斥量信號(hào)量281、互鎖函數(shù)互鎖函數(shù)是用來(lái)解決原子訪問(wèn)的,主要針對(duì)變量的原子訪問(wèn);原子訪問(wèn):當(dāng)線程訪問(wèn)資源時(shí),能夠確保沒(méi)有其它線程同時(shí)訪問(wèn)相同的資源。29Longg_x=0;//全局變量DWORDWINAPIThreadFunc1(PVOIDpvParam){ g_x++;return0;}DWORDWINAPIThreadFunc2(PVOIDpvParam){ g_x++;return0;}MOVEAX,[g_x]INCEAXMOV[g_x],EAX遞增以原子方式運(yùn)行1、互鎖函數(shù)(例)301、互鎖函數(shù)LONGInterlockedExchangeAdd()(PLONGplAddend,LONGlIncrement);Longg_x=0;//全局變量DWORDWINAPIThreadFunc1(PVOIDpvParam){ InterlockedExchangeAdd(&g_x,1);return0;}DWORDWINAPIThreadFunc2(PVOIDpvParam){ InterlockedExchangeAdd(&g_x,1);return0;}311、互鎖函數(shù)以原子操作方式用第二個(gè)參數(shù)的值取代第一個(gè)參數(shù)的當(dāng)前值。LONGInterlockedExchange()(PLONGplTarget,LONGlValue);LONGInterlockedExchangePointer()(PVOID*ppvTarget,PVOIDpvValue);321、互鎖函數(shù)比較第一個(gè)參數(shù)所指的值和第三個(gè)參數(shù)的值,如果相等,則將第一個(gè)參數(shù)所指的值置為第二個(gè)參數(shù),如果不相等則不進(jìn)行任何操作。LONGInterlockedCompareExchange()(PLONGplDestination,LONGlExchange,LONGlComparand);LONGInterlockedCompareExchangePointer()(PVOID*ppvDestination,PVOIDpvExchange,PVOIDpvComparand);332、臨界段互鎖函數(shù):以原子操作方式修改單個(gè)值臨界段:以原子方式修改復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。臨界段:關(guān)鍵代碼段,是指一小段代碼,同一個(gè)時(shí)刻,只能有一個(gè)線程具有訪問(wèn)權(quán)。多個(gè)線程訪問(wèn)同一個(gè)臨界區(qū)的原則:一次最多只能一個(gè)線程停留在臨界區(qū)內(nèi);不能讓一個(gè)線程無(wú)限地停留在臨界區(qū)內(nèi),否則其它線程將不能進(jìn)入該臨界區(qū)342、臨界段相關(guān)API函數(shù)首先定義一個(gè)臨界段對(duì)象(通常全局變量)CRITICAL_SECTIONcs臨界段對(duì)象初始化InitializeCriticalSection(&cs)
進(jìn)入臨界段EnterCriticalSection(&cs)離開(kāi)臨界段LeaveCriticalSection(&cs)釋放臨界段對(duì)象DeleteCriticalSection(&cs)35臨界段例#include<windows.h>#include<fstream>fstreamfile;DWORDWINAPIThreadFunc1(PVOIDparam){ for(inti=1;i<=1000;i++) { file<<"ThreadFunc1Output"<<i<<endl; } return0;}DWORDWINAPIThreadFunc2(PVOIDparam){ for(inti=1;i<=1000;i++) { file<<"ThreadFunc2Output"<<i<<endl; } return0;}36intmain(){("data.txt",ios::out); HANDLEThreadHandle1=CreateThread(NULL,0,ThreadFunc1,NULL,0,NULL); HANDLEThreadHandle2=CreateThread(NULL,0,ThreadFunc2,NULL,0,NULL); HANDLEhThread[2]={ThreadHandle1,ThreadHandle2}; WaitForMultipleObjects(2,hThread,TRUE,INFINITE);
(); return0;}37加上臨界段#include<windows.h>#include<fstream>fstreamfile;CRITICAL_SECTIONcs;DWORDWINAPIThreadFunc1(PVOIDparam){ for(inti=1;i<=1000;i++) { EnterCriticalSection(&cs); file<<"ThreadFunc1Output"<<i<<endl; LeaveCriticalSection(&cs); } return0;}38DWORDWINAPIThreadFunc2(PVOIDparam){ for(inti=1;i<=1000;i++) { EnterCriticalSection(&cs); file<<"ThreadFunc2Output"<<i<<endl; LeaveCriticalSection(&cs); } return0;}39使用內(nèi)核對(duì)象的線程間通信互鎖函數(shù)和臨界段都是在用戶態(tài)實(shí)現(xiàn)線程通信的,優(yōu)點(diǎn)速度快用戶態(tài)機(jī)制只能實(shí)現(xiàn)同一進(jìn)程內(nèi)線程通信。內(nèi)核對(duì)象機(jī)制可以實(shí)現(xiàn)不同進(jìn)程內(nèi)線程的通信,缺點(diǎn)速度慢。包含通知狀態(tài)和未通知狀態(tài)內(nèi)核屬性的內(nèi)核對(duì)象有:進(jìn)程,線程,作業(yè),文件,控制臺(tái)輸入文件修改通知,事件,可等待定時(shí)器信號(hào)量,互斥量40等待函數(shù):使線程進(jìn)入等待狀態(tài),直到一個(gè)對(duì)象變?yōu)橐淹ㄖ獱顟B(tài)。DWORDWaitForSingleObject(
HANDLEhHandle,
DWORDdwMilliseconds
);參數(shù)dwMilliseconds有兩個(gè)特殊值:0,則該函數(shù)立即返回;INFINITE,則線程被掛起,直到hHandle所指向的對(duì)象變?yōu)橐淹ㄖ獱顟B(tài)。使用內(nèi)核對(duì)象的線程間通信41等待函數(shù):可以保證線程的同步。DWORDWaitForMultipleObject(DWORDdwCount,
CONSTHANDLE*phHandle,BOOLfWaitAll,
DWORDdwMilliseconds
);使用內(nèi)核對(duì)象的線程間通信423、事件事件內(nèi)核對(duì)象是最簡(jiǎn)單的對(duì)象。一個(gè)使用計(jì)數(shù)一個(gè)布爾值,指明該事件是自動(dòng)重置事件(false),還是人工重置事件(true);一個(gè)布爾值,指明該事件是已通知狀態(tài),還是未通知狀態(tài)。當(dāng)人工重置事件得到通知時(shí),等待該事件的所有線程均變?yōu)榭烧{(diào)度事件;當(dāng)自動(dòng)重置事件得到通知時(shí),等待該事件的線程中只有一個(gè)線程變?yōu)榭烧{(diào)度線程。43創(chuàng)建事件內(nèi)核對(duì)象,返回句柄。HANDLECreateEvent(
PSECURITY_ATTRIBUTESpsa,//安全屬性
BOOLfManualReset,//重置方式
BOOLfInitialState,//初始狀態(tài)
PCTSTRpszName//對(duì)象名稱(chēng)
);3、事件44其它進(jìn)程中的線程可以獲得事件對(duì)象的訪問(wèn)權(quán)HANDLEOpenEvent(
DWORDfdwAccess,
BOOLfInherit,
PCTSTRpszName
);EVENT_ALL_ACCESS3、事件45一旦事件已經(jīng)創(chuàng)建,就可以直接控制它的狀態(tài)將事件設(shè)置為已通知狀態(tài)BOOLSetEvent(HANDLEhEvent);將事件設(shè)置為未通知狀態(tài)BOOLResetEvent(HANDLEhEvent);3、事件463、事件事件的主要用途是標(biāo)志事件的發(fā)生,并以此協(xié)調(diào)線程的執(zhí)行順序。例子:用戶在主線程輸入命令,控制新建線程的運(yùn)行。47#include<windows.h>#include<iostream>#include<string>usingnamespacestd;CRITICAL_SECTIONcs;DWORDWINAPIThreadFunc(PVOIDparam){EnterCriticalSection(&cs);cout<<"CreateThread:Createthreadisstarted"<<endl;cout<<"CreateThread:Createthreadiswaitingcontinuecommand.."<<endl;LeaveCriticalSection(&cs);HANDLEphEvent=OpenEvent(EVENT_ALL_ACCESS,TRUE,"ContinueCommand");WaitForSingleObject(phEvent,INFINITE);cout<<"CreateThread:Recievedcontinuecommand."<<endl;cout<<"CreateThread:Threadrunsagain."<<endl;Sleep(2000);cout<<"CreateThread:Threadfinished."<<endl;return0;}48intmain(){ InitializeCriticalSection(&cs); HANDLEhEvent=CreateEvent(NULL,FALSE,FALSE,"ContinueCommand"); cout<<"MainThread:Creatingnewthread."<<endl; HANDLEThreadHandle=CreateThread(NULL,0,ThreadFunc,NULL,CREATE_SUSPENDED,NULL); cout<<"MainThread:Newthreadcreated."<<endl; ResumeThread(ThreadHandle); stringinput; while(TRUE) { EnterCriticalSection(&cs); cout<<"MainThread:inputcommand,please"<<endl; LeaveCriticalSection(&cs); cout<<">";
49 cin>>input; if(input=="continue") { cout<<"MainThread:Letthreadcontinuerun"<<endl; SetEvent(hEvent); break; } }
WaitForSingleObject(ThreadHandle,INFINITE); cout<<"MainThread:Createthreadfinished"<<endl; DeleteCriticalSection(&cs); CloseHandle(hEvent); return0;}504、互斥量互斥量是一個(gè)種內(nèi)核對(duì)象,確保線程擁有對(duì)單個(gè)資源的互斥訪問(wèn)權(quán)。一個(gè)使用數(shù)量一個(gè)線程ID一個(gè)遞歸計(jì)數(shù)器互斥量的行為特征與臨界段相同,互斥量屬于內(nèi)核對(duì)象,而臨界段屬于用戶方式對(duì)象?;コ饬康木€程ID標(biāo)識(shí)系統(tǒng)中哪個(gè)線程擁有互斥量,為0,沒(méi)有線程擁有遞歸計(jì)數(shù)器指明線程擁有互斥量的次數(shù)514、互斥量經(jīng)常用于保護(hù)多個(gè)線程訪問(wèn)的內(nèi)存塊;控制對(duì)共享資源的訪問(wèn)保證每次只能有一個(gè)線程獲得互斥量524、互斥量互斥量的創(chuàng)建,返回句柄HANDLECreateMutex(PSECURITY_ATTRIBUTESpsa,//安全屬性的指針
BOOLbInitialOwner,//初始化互斥對(duì)象的所有者
PCTSTRpszName
//指向互斥對(duì)象名的指針
);534、互斥量另一個(gè)進(jìn)程可獲得本進(jìn)程相關(guān)的互斥量的句柄HANDLEOpenMutex(
DWORDfdwAccess,//access
BOOLbInheritHandle,//inheritanceoption
PCTSTRpszName//objectname
);54釋放互斥量HANDLEReleaseMutex(
HANDLEhMutex
);等待互斥量DWORDWaitForSingleObject(
HANDLEhHandle,
DWORDdwMilliseconds
);互斥量不同于其它內(nèi)核對(duì)象,互斥對(duì)象有一個(gè)“線程所有權(quán)”的概念。4、互斥量55#include<windows.h>#include<fstream>usingnamespacestd;fstreamfile;DWORDWINAPIThreadFunc1(PVOIDparam){ HANDLE*phMutex=(HANDLE*)param; for(inti=1;i<=100;i++) { WaitForSingleObject(*phMutex,INFINITE); file<<"ThreadFunc1Output"<<i<<endl; ReleaseMutex(*phMutex); } return0;}56DWORDWINAPIThreadFunc2(PVOIDparam){ HANDLE*phMutex=(HANDLE*)param; for(inti=1;i<=100;i++) { WaitForSingleObject(*phMutex,INFINITE); file<<"ThreadFunc2Output"<<i<<endl; ReleaseMutex(*phMutex); } return0;}57intmain(){ ("data.txt",ios::out); HANDLEhMutex=CreateMutex(NULL,FALSE,"DisplayMutex"); HANDLEThreadHandle1=CreateThread(NULL,0,ThreadFunc1,&hMutex,0,NULL); HANDLEThreadHandle2=CreateThread(NULL,0,ThreadFunc2,&hMutex,0,NULL); HANDLEhThread[2]={ThreadHandle1,ThreadHandle2}; WaitForMultipleObjects(2,hThread,TRUE,INFINITE); CloseHandle(hMutex); (); return0;}585、信號(hào)量信號(hào)量是一個(gè)內(nèi)核對(duì)象,可用來(lái)管理大量有限的系統(tǒng)資源一個(gè)使用計(jì)數(shù)32位整數(shù),最大資源數(shù)量32位整數(shù),當(dāng)前資源數(shù)量信號(hào)量使用規(guī)則:當(dāng)前資源數(shù)量大于0,則等待信號(hào)量的線程獲得資源繼續(xù)運(yùn)行,當(dāng)前資源數(shù)量減1當(dāng)前資源數(shù)量等于0,則等待信號(hào)量的線程繼續(xù)等待,直到有線程釋放信號(hào)量,使當(dāng)前資源數(shù)量大于059創(chuàng)建信號(hào)量5、信號(hào)量HANDLECreateSemaphore(
PSECURITY_ATTRIBUTESpsa,
LONGlInitialCount,//initialcount
LONGlMaximumCount,//maximumcount
PCTSTRpszName//objectname
);60另一進(jìn)程可獲得與本進(jìn)程相關(guān)的信號(hào)量的句柄5、信號(hào)量HANDLEOpenSemaphore(
DWORDfdwAccess,
BOOLbInheritHandle,//inheritanceoption
PCTSTRpszName//objectname
);61釋放信號(hào)量例,兩個(gè)線程分別有一個(gè)初值為0的Int型局部變量,兩個(gè)線程的行為是在一個(gè)循環(huán)中,使整型變量遞增,一個(gè)約束條件,在遞增過(guò)程中,這兩個(gè)值的差不超過(guò)5ReleaseSemaphore(
HANDLEhSem,
LONGlReleaseCount,
PLONGplPreviousCount
);5、信號(hào)量62HANDLEhsem1=CreateSemaphore(NULL,5,10,"sem1");HANDLEhsem2=CreateSemaphore(NULL,5,10,"sem2");inti1=0;inti2=0;DWORDWINAPIThreadFunc1(PVOIDparam){ for(inti=1;i<=100;i++) { WaitForSingleObject(hsem1,INFINITE); ReleaseSemaphore(hsem2,1,NULL); i1++; file<<"i1="<<i1<<"i2="<<i2<<endl; } return0;}63DWORDWINAPIThreadFunc2(PVOIDparam){ for(inti=1;i<=100;i++) { WaitForSingleObject(hsem2,INFINITE); ReleaseSemaphore(hsem1,1,NULL); i2++; file<<"i1="<<i1<<"i2="<<i2<<endl; } return0;}64線程的優(yōu)先級(jí)決定它何時(shí)運(yùn)行和接收多少CPU時(shí)間。優(yōu)先級(jí)共32級(jí),是從0到31的數(shù)值,稱(chēng)為基本優(yōu)先級(jí)別。0-15級(jí)是普通優(yōu)先級(jí)線程的優(yōu)先級(jí)可以動(dòng)態(tài)變化高
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 全程獨(dú)家代賣(mài)合同范本
- 華帝櫥柜合同范例
- 組裝電腦銷(xiāo)售合同范本
- 單位電路維修合同范本
- 鋼結(jié)構(gòu)廠房拆除合同范本
- 吊頂線型燈采購(gòu)合同范例
- 合同范本商務(wù)
- 變更臨時(shí)租賃合同范本
- 交車(chē)合同范本
- 倒運(yùn)費(fèi)合同范本
- 2025年黑龍江旅游職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)傾向性測(cè)試題庫(kù)附答案
- 《多彩的節(jié)日民俗》(教學(xué)設(shè)計(jì))浙教版四年級(jí)下冊(cè)綜合實(shí)踐活動(dòng)
- 2025年黃河水利職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)新版
- 2025年健康咨詢管理服務(wù)合同范文
- 光學(xué)鏡片透光率測(cè)量基準(zhǔn)
- 歷史-貴州省貴陽(yáng)市2025年高三年級(jí)適應(yīng)性考試(一)(貴陽(yáng)一模)試題和答案
- 2025年01月2025全國(guó)婦聯(lián)所屬在京事業(yè)單位公開(kāi)招聘93人筆試歷年典型考題(歷年真題考點(diǎn))解題思路附帶答案詳解
- 輻射安全管理測(cè)試題含答案
- 2025年北京社會(huì)管理職業(yè)學(xué)院高職單招高職單招英語(yǔ)2016-2024年參考題庫(kù)含答案解析
- 信息系統(tǒng)項(xiàng)目計(jì)劃書(shū)
- 2025學(xué)生管理工作計(jì)劃怎么寫(xiě)
評(píng)論
0/150
提交評(píng)論