创建线程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