秒杀多线程第二篇CreateThread与_beginthreadex本质区别

参考文章:http://blog.csdn.net/morewindows/article/details/7392749

CreateThread:函数原型

HANDLEWINAPICreateThread(

  LPSECURITY_ATTRIBUTESlpThreadAttributes,/

  SIZE_TdwStackSize,

  LPTHREAD_START_ROUTINElpStartAddress,

  LPVOIDlpParameter,

  DWORDdwCreationFlags,

  LPDWORDlpThreadId

);

第一个参数:内核对象安全属性,一般用null来默认设置

第二个参数:表示线程栈空间大小,传入0(表示默认1MB)

第三个参数:新线程所执行的线程函数地址,可以使用一个函数地址

第四个参数:传给线程函数的参数

第五个参数:(标志)控制线程的创建,0:线程创建后可以立即调用

        CREATE_SUSPENDED:创建后暂停运行,无法调度直到使用ResumeThread()

第六个参数:返回线程的ID号,如果使用NULL则表示不需要返回线程ID

WaitForSingleObject原型  

 作用:等待函数——使线程进入等待状态,直到指定的内核空间被触发

函数原形:

DWORDWINAPIWaitForSingleObject(

  HANDLEhHandle,

  DWORDdwMilliseconds

);

第一个参数:要等待的内核对象

第二个参数:最长等待的时间,以毫秒为单位,如传入5000就表示5秒,传入0就立即返回,传入INFINITE表示无限等待

 返回值:时间到还没被触发返回WAIT_TIMEOUT    传入错误参数时返回WAIT_FILED

#include <stdio.h>
#include <windows.h>

DWORD WINAPI ThreadFun(LPVOID pM) //LPVOID是一个没有类型的指针
{
	printf("子线程的ID号为:%d\n子线程输出:helloword\N",GetCurrentThreadId());
	return 0;
}

int main()
{
	printf("   简单的多线程实例\n");
	HANDLE handle=CreateThread(NULL,0,ThreadFun,NULL,0,NULL);
	WaitForSingleObject(handle,INFINITE);
	return 0;
}

使用 _beginthreadex创建多线程

 直接使用时会出现error C2065: '_beginthreadex' : undeclared identifier的错误

解决办法:

Project->Settings->C/C++->Code Generation->Use run-time libray->Debug Multithread,或 Multithread,或 Debug Multithread DLL, 或 Multithread DLL都可以,即Use run-time library需要使用多线程的

//创建多子个线程实例
#include <stdio.h>
#include <process.h>
#include <windows.h>
//子线程函数
unsigned int __stdcall ThreadFun(PVOID pM)//被这些修饰关键字修饰的函数,其参数都是从右向左通过堆栈传递的
{
	printf("线程ID号为%4d的子线程说:Hello World\n", GetCurrentThreadId());
	return 0;
}
//主函数,所谓主函数其实就是主线程执行的函数。
int main()
{
	printf("     创建多个子线程实例 \n");
	printf(" -- by MoreWindows( http://blog.csdn.net/MoreWindows ) --\n\n");
	
	const int THREAD_NUM = 5;
	HANDLE handle[THREAD_NUM];
	for (int i = 0; i < THREAD_NUM; i++)
		handle[i] = (HANDLE)_beginthreadex(NULL, 0, ThreadFun, NULL, 0, NULL);
	WaitForMultipleObjects(THREAD_NUM, handle, TRUE, INFINITE);
	return 0;
}

使用 _beginthreadex创建多线程(子线程说不同的话)

此方法含有重大漏洞原因:几个线程不同步,且对同一个全局变量进行操作

//创建多子个线程实例
#include <stdio.h>
#include <process.h>
#include <windows.h>

int G_count;
//子线程函数
unsigned int __stdcall ThreadFun(PVOID pM)
{
	G_count++;
	printf("线程ID号为%4d的子线程说:%d\n", GetCurrentThreadId(),G_count);
	return 0;
}
//主函数,所谓主函数其实就是主线程执行的函数。
int main()
{
	printf("     创建多个子线程实例 \n");
	printf(" -- by MoreWindows( http://blog.csdn.net/MoreWindows ) --\n\n");
	
	const int THREAD_NUM = 5;
	HANDLE handle[THREAD_NUM];
	G_count=0;
	for (int i = 0; i < THREAD_NUM; i++)
		handle[i] = (HANDLE)_beginthreadex(NULL, 0, ThreadFun, NULL, 0, NULL);
	WaitForMultipleObjects(THREAD_NUM, handle, TRUE, INFINITE);
	return 0;
}

自己使用 _beginthreadex创建多线程(子线程服务函数不同)

  运行过程中出现了错误,不知道原因,待以后解决

 

 代码部分:

//创建多子个线程实例
#include <stdio.h>
#include <process.h>
#include <windows.h>

//子线程函数
unsigned int __stdcall ThreadFun1(PVOID pM)
{
	printf("线程ID号为%4d的子线程1说:%d\n", GetCurrentThreadId(),1);
	return 0;
}

unsigned int __stdcall ThreadFun2(PVOID pM)
{
	printf("线程ID号为%4d的子线程2说:%d\n", GetCurrentThreadId(),2);
	return 0;
}
//主函数,所谓主函数其实就是主线程执行的函数。
int main()
{
	printf("     创建多个子线程实例 \n");
	
	HANDLE handle[1];

	handle[0] = (HANDLE)_beginthreadex(NULL, 0, ThreadFun1, NULL, 0, NULL);
	handle[1] = (HANDLE)_beginthreadex(NULL, 0, ThreadFun2, NULL, 0, NULL);
	WaitForMultipleObjects(2, handle, TRUE, INFINITE);
	return 0;
}
原文地址:https://www.cnblogs.com/yuqilihualuo/p/3016745.html