3 回答

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊
一、Windows API函數(shù)。該函數(shù)在主線程的基礎(chǔ)上創(chuàng)建一個(gè)新線程。微軟在Windows API中提供了建立新的線程的函數(shù)CreateThread。
二、CreateThread將在主線程的基礎(chǔ)上創(chuàng)建一個(gè)新線程,大致做如下步驟:
1.在內(nèi)核對象中分配一個(gè)線程標(biāo)識(shí)/句柄,可供管理,由CreateThread返回
2.把線程退出碼置為STILL_ACTIVE,把線程掛起計(jì)數(shù)置1
3.分配context結(jié)構(gòu)
4.分配兩頁的物理存儲(chǔ)以準(zhǔn)備棧,保護(hù)頁設(shè)置為PAGE_READWRITE,第2頁設(shè)為PAGE_GUARD
5.lpStartAddr和lpvThread值被放在棧頂,使它們成為傳送給StartOfThread的參數(shù)
6.把context結(jié)構(gòu)的棧指針指向棧頂(第5步)指令指針指向startOfThread函數(shù)
三、MSDN中CreateThread原型:
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,//SD
SIZE_T dwStackSize,//initialstacksize
LPTHREAD_START_ROUTINE lpStartAddress,//threadfunction
LPVOID lpParameter,//threadargument
DWORD dwCreationFlags,//creationoption
LPDWORD lpThreadId//threadidentifier
)
processthreadsapi.h中CreateThread原型:
WINBASEAPI
_Ret_maybenull_
HANDLE
WINAPI
CreateThread(
_In_opt_LPSECURITY_ATTRIBUTES lpThreadAttributes,
_In_SIZE_T dwStackSize,
_In_LPTHREAD_START_ROUTINE lpStartAddress,
_In_opt___drv_aliasesMemLPVOID lpParameter,
_In_DWORD dwCreationFlags,
_Out_opt_LPDWORD lpThreadId
);
四、示例:

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超6個(gè)贊
關(guān)于六個(gè)參數(shù):第一個(gè)是所創(chuàng)線程的安全屬性,多設(shè)置為NULL; 第二個(gè)是所創(chuàng)線程堆棧的大小,多設(shè)為0; 第三個(gè)是你創(chuàng)建的線程的地址;(此處應(yīng)為你的線程函數(shù)的函數(shù)名) 第四個(gè)是傳遞給你的線程函數(shù)的參數(shù); 第五個(gè)是表示你創(chuàng)建的線程是否立即執(zhí)行,設(shè)為0則立即執(zhí)行; 第六個(gè)則是你創(chuàng)建線程的ID號(hào),設(shè)為NULL就行。關(guān)于線程你要知道他有一個(gè)對應(yīng)的線程函數(shù),你創(chuàng)建線程后即執(zhí)行你的函數(shù)(若你指定第五個(gè)參數(shù)為0立即執(zhí)行,所執(zhí)行的函數(shù)即為第三個(gè)參數(shù))對于二樓他設(shè)置了一個(gè)等待,若無此等待可能會(huì)導(dǎo)致創(chuàng)建線程的函數(shù)已經(jīng)退出,而你的線程卻還在運(yùn)行。

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超5個(gè)贊
(1)LPTHREAD_START_ROUTINE lpStartAddress 指定了線程函數(shù)的起始地址,新建線程將從此地址開始執(zhí)行,直到return語句返回,把控制權(quán)交給操作系統(tǒng)。
(2)LPVOID lpParameter 則是傳遞給線程函數(shù)的參數(shù),也即傳遞給(1)中指定的線程函數(shù)的地址。
以下是一個(gè)例子:創(chuàng)建線程后,將轉(zhuǎn)到線程函數(shù)執(zhí)行,遇到return語句后返回到main函數(shù)。
#include <iostream>
#include <windows.h>
using namespace std;
/*ThreadProc為LPTHREAD_START_ROUTINE lpStartAddress
*參數(shù)指定的線程函數(shù).lpParam則是LPVOID lpParameter指
*定的傳遞給線程函數(shù)的參數(shù)*/
DWORD WINAPI ThreadProc(LPVOID lpParam)
{
for (int i = 0;i < 20;++i)
{
cout << "I am from a thread,count = " << i <<endl;
}
return 0;
}
int main()
{
HANDLE hThread;
DWORD dwThreadID;
hThread = ::CreateThread(
NULL,
NULL,
ThreadProc, // 線程入口地址
NULL,
0,
&dwThreadID);
::WaitForSingleObject(hThread,INFINITE);
::CloseHandle(hThread);
return 0;
}
- 3 回答
- 0 關(guān)注
- 163 瀏覽
添加回答
舉報(bào)