C++多線程(一)
WIN 多線程API
一 簡單實例
比較簡單的代碼,創建10個線程,其中使第4個線程在一創建就掛起,等到其他的線程執行的差不多的時候再使第4個線程恢復執行。
#include?<stdio.h>?
#include?<stdlib.h>?
#include?<windows.h>?

#define?THREAD_NUM?10

DWORD?WINAPI?PrintThreads?(LPVOID);

int?main?()?


{?
????HANDLE?hThread[THREAD_NUM];?
????DWORD?dwThreadID[THREAD_NUM];?

????for?(int?i=0;?i<THREAD_NUM;?++i)?

????
{?
????????int?isStartImmediate?=?0;
????????if(3?==?i)
????????????isStartImmediate?=?CREATE_SUSPENDED;
????????hThread[i]=CreateThread(NULL,????????????????//?security?attributes?that?should?be?applied?to?the?new?thread,?
??????????????????????????????????????????????????????????????????????????????? ?//?this?is?for?NT.?Use?NULL?to?get?the?default?security?attributes.?Use?NULL?for?win95?
????????????????????????????????0,??????????????????????????????????????????? //?default?size?of?1MB?can?be?passed?by?passing?zero.?
????????????????????????????????PrintThreads,???????????????????? //?function?name:address?of?the?function?where?the?new?thread?starts.
????????????????????????????????(LPVOID)i,???????????????????????? //?parameter(void?pointer):?pointer?to?the?32?bit?parameter?that?will?be?passed?into?the?thread
????????????????????????????????isStartImmediate,???????????? //?flags?to?control?the?creation?of?the?thread.?Passing?zero?starts?the?thread?immediately.?
?????????????????????????????????????????????????????????????????????????? //?Passing?CREATE_SUSPENDED?suspends?the?thread?until?the?ResumeThread(?)?function?is?called.
????????????????????????????????&dwThreadID[i]??????????? //?pointer?to?a?32-bit?variable?that?receives?the?thread?identifier.
????????????????????????????????);?
????????if?(hThread[i])

????????
{?
????????????printf?("Thread?launched?successfully/n");????????????????
????????}?????????
????}?
????printf("Start?sleep?100,?and?let?other?thread?excute/n");
????Sleep?(100);????

????printf("Start?sleep?100,?and?thread?3?excute/n");
????ResumeThread(hThread[3]);
????
????Sleep(100);

????for(int?i?=?0;?i<THREAD_NUM;?++i)

????
{
????????if?(hThread[i])

????????
{????????????
????????????CloseHandle(hThread[i]);????//?You?need?to?use?this?to?release?kernel?objects?when?you?are?done?using?them.?
????????????????????????????????????????//?If?a?process?exits?without?closing?the?thread?handle,?
????????????????????????????????????????//?the?operating?system?drops?the?reference?counts?for?those?objects.?
????????????????????????????????????????//?But?if?a?process?frequently?creates?threads?without?closing?the?handles,?
????????????????????????????????????????//?there?could?be?hundreds?of?thread?kernel?objects?lying?around?and?these?resource?leaks?can?have?a?big?hit?on?performance.
????????}?
????}
????return?(0);?
}?

//function?PrintThreads?
DWORD?WINAPI?PrintThreads?(LPVOID?num)


{
????for?(int?i=0;?i<10;?i++)?
????????printf?("Thread?Number?is?%d%d%d/n",?num,num,num);?
????return?0;
}
一 簡單實例
比較簡單的代碼,創建10個線程,其中使第4個線程在一創建就掛起,等到其他的線程執行的差不多的時候再使第4個線程恢復執行。









































































二 其他基本API的說明
CreateThread() 調用成功返回句柄和一個id。
CloseHandle()? 關閉一個打開的對象句柄,該對象句柄可以是線程句柄,也可以是進程、信號量等其他內核對象的句柄.
SuspendThread(HANDLE) 允許開發人員將HANDLE指定的線程掛起,如果要掛起的線程占有共享資源,則可能導致死鎖。
ResumeThread(HANDLE)? 恢復指定的線程。
TerminateThread() 立即終止線程的工作,不做任何清理工作。
ExitThread() 線程函數返回時回調用次函數,所以一般我們不去顯示的調用。
ExitThread是推薦使用的結束一個線程的方法,當調用該函數時,當前線程的棧被釋放,然后線程終止,相對于TerminateThread函數來說,這樣做能夠更好地完成附加在該線程上的DLL的清除工作. 但是ExitThread()會導致線程在清處構造器/自動變量之前就終止,所以我們最好不要顯示的調用ExitThread()。