視窗:多綫程-最簡示例

多綫程的概念阿莎的已經被說了不知道多少次了,一下就給出個例子(可能是最簡單的多綫程程式示例了),大家看看就明白了。

説明一下先:

一個程式必須要有一個主函數,main或者WinMain(學C語言第一節課書上就說了),它是個函數、一個主過程,其實也是一個進程,這個第一節課時沒說,可我告訴你了現在。這個綫程與別的綫程不同之処就在於它是先來的,而且它是祖宗,就算它根本不管事兒沒它也不行——操作系統就認準了它,它完蛋了,程式就完蛋了。

主綫程在運行的時候創建並啓動了其它的綫程,綫程的執行就是跳到那個綫程的函數去執行,不要以爲有什麽了不起,其實那個函數就是那個綫程,或者很多綫程是一個函數(一個函數被同時執行很多次)。

其實你也可以把那些綫程函數“打破”,都放到main函數裏去,可以的,只不過那樣的話調度起來就不一樣了——mian函數綫形執行,讓你體會不出“多綫程”那種“並發性”的激情了。不過再從微觀上來看,就算是“多綫程”,在微觀上還是串行的——你只有一個CPU,在一時刻它只能執行一條指令,如果你的大腦根CPU一樣快,又是火眼金睛,那麽你就能輕而易舉地看穿了,一切就毫無並行而言。這或許是你很失望,不過我要提醒你更令你失望的可能是自己的大腦沒有CPU那麽快,或許眼睛還有點近視,所以你才有興致閲讀本文,我也是因爲自己大腦不如意才寫本文的——畢竟在宏觀上“多綫程”還是並行的。

好了,上路吧!

這段代碼的流程如下:

主綫程main啓動後創建WorkThread綫程,然後主綫程和WorkThread綫程各自不斷打印“i”和0~10的整數。

另:WorkThread綫程啓動時主綫程將100作爲參數傳給了它。

下面是碼子:

#pragma  once

#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)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值