多線程的一點點

 

創建多線程的函數

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(時間片),然後控制權就會轉移.

線程並不總是立即啓動

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章