創建線程CreateThread


線程創建函數CreateThread

修改說明:

CreateThread()l來創建線程其實是一種不太好的方法,在實際使用中盡量使用_beginthreade()來創建線程,因為更加的安全

 

函數的原型:

    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
    );

 

參數說明:

第一個參數 lpThreadAttributes 表示線程內核對象的安全屬性,一般傳入NULL表示使用默認設置。

第二個參數 dwStackSize 表示線程棧空間大小。傳入0表示使用默認大小(1MB)。

第三個參數 lpStartAddress 表示新線程所執行的線程函數地址,多個線程可以使用同一個函數地址。

第四個參數 lpParameter 是傳給線程函數的參數。

第五個參數 dwCreationFlags 指定額外的標志來控制線程的創建,為0表示線程創建之后立即就可以進行調度,如果為CREATE_SUSPENDED則表示線程創建后暫停運行,這樣它就無法調度,直到調用ResumeThread()。

第六個參數 lpThreadId 將返回線程的ID號,傳入NULL表示不需要返回該線程ID號。

 

返回值

CreateThread的返回值是線程的句柄,失敗的話就返回NULL

 

實例1:

/* 創建第一個線程。主進程結束,則撤銷線程。 */

#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;
}

  

 

實例2:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <process.h>

//typedef unsigned long       DWORD;
//#define WINAPI      __stdcall  標准的呼叫;
//typedef void far            *LPVOID;

DWORD WINAPI mymsg(LPVOID lp)
{
	MessageBoxA(0,"Hello China","Welcome!",0);
	return 0;
}


int main(void)
{
	//順序執行
	//MessageBoxA(0,"Hello China","Welcome!",0);
	//MessageBoxA(0,"Hello China","Welcome!",0);
	//MessageBoxA(0,"Hello China","Welcome!",0);
	//MessageBoxA(0,"Hello China","Welcome!",0);

	//_beginthread(); //以前依賴的是_beginthread進行多線程執行;



	int i;
	HANDLE hthread;
	DWORD threadid;//保存進程的編號;


	for (i = 0; i <5; i++)
	{
		hthread = CreateThread(
			NULL,//表示線程內核對象的安全屬性;
			NULL,//表示線程堆棧空間的大小;
			mymsg,//表示新線程所執行的線程函數地址;
			NULL,//函數的參數;
			0,//立刻執行;
			&threadid//將返回線程的ID號;
			);

		//單線程的等待;
		//INFINITE //超時等待,等待上一步執行完畢才繼續執行;
		//IGNORE   //忽略等待,直接啟用線程;


		WaitForSingleObject(hthread,INFINITE);
		CloseHandle(hthread);//關閉一個線程;
	}


	//mymsg(NULL);
	//CreateThread()


	system("pause");
	return 0;
}
  

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM