創建多線程的函數
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, //新線程的Security屬性,NULL表示缺省
DWORD dwStackSize, //線程擁有自身堆棧大小 0默認表示1M
LPTHREAD_START_ROUTINE lpStartAddress, //新線程開始地址,函數的指針
LPVOID lpParameter, //新線程的參數
DWORD dwCreateFlags, //開始標誌,默認爲立即開始
LPWORD lpThread //新的線程ID,不需要可傳入爲空
)
如果該函數調用成功則返回一個Handle,調用失敗則返回FALSE,可用GetLastError()獲取原因
當CreateThread函數被調用時,CreateThread開啓一個新的線程,該線程調用線程函數(LPTHREAD_START_ROUTINE),而原來的線程繼續進行,即線程函數被異步的執行
int main(int argc, char* argv[])
{
HANDLE hThread[10];
DWORD ThreadID[10];
for (int i=0; i<10; i++)
{
hThread[i] = CreateThread(0,0,ThreadFunc,&i,0,ThreadID);
}
return 0;
}
DWORD WINAPI ThreadFunc(LPVOID n)
{
int *m = (int *)n;
cout<<*m<<endl;
return 0;
}
線程函數必須有以下特點
1.返回值爲DWORD,
2.調用約定爲WINAPI //__stacall
3.參數有且只有一個,並且爲LPVOID類型
注意:
線程執行的次序無法保證,線程之間執行的次序可看爲隨機
context Switches(線程切換??)可以在任何時刻發生
線程對於小的改變有很高的敏感,在搶先式多任務調度中,每個線程被允許一個固定的timeslice(時間片),然後控制權就會轉移.
線程並不總是立即啓動