多綫程的概念阿莎的已經被說了不知道多少次了,一下就給出個例子(可能是最簡單的多綫程程式示例了),大家看看就明白了。
説明一下先:
一個程式必須要有一個主函數,main或者WinMain(學C語言第一節課書上就說了),它是個函數、一個主過程,其實也是一個進程,這個第一節課時沒說,可我告訴你了現在。這個綫程與別的綫程不同之処就在於它是先來的,而且它是祖宗,就算它根本不管事兒沒它也不行——操作系統就認準了它,它完蛋了,程式就完蛋了。
主綫程在運行的時候創建並啓動了其它的綫程,綫程的執行就是跳到那個綫程的函數去執行,不要以爲有什麽了不起,其實那個函數就是那個綫程,或者很多綫程是一個函數(一個函數被同時執行很多次)。
其實你也可以把那些綫程函數“打破”,都放到main函數裏去,可以的,只不過那樣的話調度起來就不一樣了——mian函數綫形執行,讓你體會不出“多綫程”那種“並發性”的激情了。不過再從微觀上來看,就算是“多綫程”,在微觀上還是串行的——你只有一個CPU,在一時刻它只能執行一條指令,如果你的大腦根CPU一樣快,又是火眼金睛,那麽你就能輕而易舉地看穿了,一切就毫無並行而言。這或許是你很失望,不過我要提醒你更令你失望的可能是自己的大腦沒有CPU那麽快,或許眼睛還有點近視,所以你才有興致閲讀本文,我也是因爲自己大腦不如意才寫本文的——畢竟在宏觀上“多綫程”還是並行的。
好了,上路吧!
這段代碼的流程如下:
主綫程main啓動後創建WorkThread綫程,然後主綫程和WorkThread綫程各自不斷打印“i”和0~10的整數。
另:WorkThread綫程啓動時主綫程將100作爲參數傳給了它。
下面是碼子:
#include < windows.h >
#include < stdio.h >
#include < stdlib.h >
DWORD WINAPI WorkThread(LPVOID pVoid);
// 主綫程
int main( void ) ... {
printf("程式開始... ");
int * num;//傳遞給新綫程的參數
num = (int *)malloc(sizeof(int));
* num = 100;
DWORD dwThreadId;//綫程ID
HANDLE hThread = CreateThread(NULL, 0, WorkThread, num, 0, &dwThreadId);//創建綫程
if(hThread == FALSE)...{
printf("綫程創建失敗! 程式退出... ");
return EXIT_FAILURE;
}
for(int i = 0; i <= 20; i++)...{
printf("i");
Sleep(500);
}
CloseHandle(hThread);
printf(" ");
printf("程式結束. ");
return EXIT_SUCCESS;
}
// WorkThread綫程代碼
DWORD WINAPI WorkThread(LPVOID pVoid) ... {
for(int j = 0; j <= 10; j++)...{
printf("%d", j);
Sleep(500);
}
printf("==%d== ", *(int *)pVoid);
return EXIT_SUCCESS;
}
下面説明一下:綫程由CreateThread函數創建,其參數中指定了綫程的運行函數,返回新綫程的句柄。綫程ID另有他用,這裡不管他。CreateThread把num作爲參數傳了進去,注意,他接受的是一個指針,什麽類型的都可以(就是LPVOID類型的),但可千萬不要把一個數或者字符什麽的傳進去了,那是沒用的,要用指針~~~。然後綫程函數用變量pVoid接收它(是這一句:DWORD WINAPI WorkThread(LPVOID pVoid)),然後你再把這個LPVOID類型的pVoid轉回來就行了,是什麽類型的專稱什麽類型,這裡是printf("==%d==/n", *(int *)pVoid)。