1. 程式人生 > >windows多執行緒(一) 建立執行緒 CreateThread

windows多執行緒(一) 建立執行緒 CreateThread

一 執行緒建立函式 CreateThread

修改說明:
這裡 說了另一種建立執行緒方法,使用_beginthreadex()更安全的建立執行緒,在實際使用中儘量使用_beginthreadex()來建立執行緒,在部落格中使用 CreateThread()l來建立執行緒其實是一種不太好的方法,不過這裡只做原理分析,不用在實際專案中,暫且就這樣吧!

1. 函式原型:


    HANDLE WINAPI CreateThread(
      _In_opt_  LPSECURITY_ATTRIBUTES  lpThreadAttributes,   
      _In_      SIZE_T                 dwStackSize,
      _In_      LPTHREAD_START_ROUTINE lpStartAddress,
      _In_opt_  LPVOID                 lpParameter,
      _In_      DWORD                  dwCreationFlags,
      _Out_opt_ LPDWORD                lpThreadId
    );

2. 引數說明:

  • 第一個引數 lpThreadAttributes 表示執行緒核心物件的安全屬性,一般傳入NULL表示使用預設設定。

  • 第二個引數 dwStackSize 表示執行緒棧空間大小。傳入0表示使用預設大小(1MB)。

  • 第三個引數 lpStartAddress 表示新執行緒所執行的執行緒函式地址,多個執行緒可以使用同一個函式地址。

  • 第四個引數 lpParameter 是傳給執行緒函式的引數。

  • 第五個引數 dwCreationFlags 指定額外的標誌來控制執行緒的建立,為0表示執行緒建立之後立即就可以進行排程,如果為CREATE_SUSPENDED則表示執行緒建立後暫停執行,這樣它就無法排程,直到呼叫ResumeThread()。

  • 第六個引數 lpThreadId 將返回執行緒的ID號,傳入NULL表示不需要返回該執行緒ID號。

3.返回值

執行緒建立成功返回新執行緒的控制代碼,失敗返回NULL

二 例項



/* 建立第一個執行緒。主程序結束,則撤銷執行緒。 */

#include<Windows.h>
#include<stdio.h>

DWORD WINAPI ThreadFunc(LPVOID);

void main()
{
    HANDLE hThread;
    DWORD  threadId;

    hThread = CreateThread(NULL, 0, ThreadFunc, 0, 0, &threadId); // 建立執行緒
    printf("我是主執行緒, pid = %d\n", GetCurrentThreadId());  //輸出主執行緒pid
    Sleep(2000);
}

DWORD WINAPI ThreadFunc(LPVOID p)
{   
    printf("我是子執行緒, pid = %d\n", GetCurrentThreadId());   //輸出子執行緒pid
    return 0;
}



這個程式功能很簡單,主執行緒建立一個執行緒,同時主執行緒和子執行緒分別向控制檯輸出執行緒的PID,如下圖: