使用CreateThread函数创建线程
線程是進程中的一個實體,是被系統(tǒng)獨立調(diào)度和分派的基本單位。一個進程可以擁有多個線程,但是一個線程必須有一個進程。線程自己不擁有系統(tǒng)資源,只有運行所必須的一些數(shù)據(jù)結(jié)構(gòu),但它可以與同屬于一個進程的其它線程共享進程所擁有的全部資源,同一個進程中的多個線程可以并發(fā)執(zhí)行。
在C/C++中可以通過CreateThread函數(shù)在進程中創(chuàng)建線程,函數(shù)的具體格式如下:
HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,DWORD dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,DWORD dwCreationFlags,LPDWORD lpThreadID);參數(shù)的含義如下:lpThreadAttrivutes:指向SECURITY_ATTRIBUTES的指針,用于定義新線程的安全屬性,一般設(shè)置成NULL;
dwStackSize:分配以字節(jié)數(shù)表示的線程堆棧的大小,默認值是0;
lpStartAddress:指向一個線程函數(shù)地址。每個線程都有自己的線程函數(shù),線程函數(shù)是線程具體的執(zhí)行代碼;
lpParameter:傳遞給線程函數(shù)的參數(shù);
dwCreationFlags:表示創(chuàng)建線程的運行狀態(tài),其中CREATE_SUSPEND表示掛起當前創(chuàng)建的線程,而0表示立即執(zhí)行當前創(chuàng)建的進程;
lpThreadID:返回新創(chuàng)建的線程的ID編號;
如果函數(shù)調(diào)用成功,則返回新線程的句柄,調(diào)用WaitForSingleObject函數(shù)等待所創(chuàng)建線程的運行結(jié)束。函數(shù)的格式如下:
DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds);參數(shù)的含義如下:hHandle:指定對象或時間的句柄;
dwMilliseconds:等待時間,以毫秒為單位,當超過等待時間時,此函數(shù)返回。如果參數(shù)設(shè)置為0,則該函數(shù)立即返回;如果設(shè)置成INFINITE,則該函數(shù)直到有信號才返回。
一般情況下需要創(chuàng)建多個線程來提高程序的執(zhí)行效率,但是多個線程同時運行的時候可能調(diào)用線程函數(shù),在多個線程同時對一個內(nèi)存地址進行寫入操作,由于CPU時間調(diào)度的問題,寫入的數(shù)據(jù)會被多次覆蓋,所以要使線程同步。
就是說,當有一個線程對文件進行操作時,其它線程只能等待。可以通過臨界區(qū)對象實現(xiàn)線程同步。臨界區(qū)對象是定義在數(shù)據(jù)段中的一個CRITICAL_SECTION結(jié)構(gòu),Windows內(nèi)部使用這個結(jié)構(gòu)記錄一些信息,確保同一時間只有一個線程訪問改數(shù)據(jù)段中的數(shù)據(jù)。
使用臨界區(qū)的步驟如下:
(1)初始化一個CRITICAL_SECTION結(jié)構(gòu);在使用臨界區(qū)對象之前,需要定義全局CRITICAL_SECTION變量,在調(diào)用CreateThread函數(shù)前調(diào)用InitializeCriticalSection函數(shù)初始化臨界區(qū)對象;
(2)申請進入一個臨界區(qū);在線程函數(shù)中要對保護的數(shù)據(jù)進行操作前,可以通過調(diào)用EnterCriticalSection函數(shù)申請進入臨界區(qū)。由于同一時間內(nèi)只能有一個線程進入臨界區(qū),所以在申請的時候如果有一個線程已經(jīng)進入臨界區(qū),則該函數(shù)就會一直等到那個線程執(zhí)行完臨界區(qū)代碼;
(3)離開臨界區(qū);當執(zhí)行完臨界區(qū)代碼后,需要調(diào)用LeaveCriticalSection函數(shù)離開臨界區(qū);
(4)刪除臨界區(qū);當不需要臨界區(qū)時調(diào)用DeleteCriticalSection函數(shù)將臨界區(qū)對象刪除;
下面的代碼創(chuàng)建了5個線程,每個線程在文件中寫入10000個“hello”:
總結(jié)
以上是生活随笔為你收集整理的使用CreateThread函数创建线程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用CreateFile读写文件
- 下一篇: WinPcap笔记(1):VisualS