秒杀多线程第二篇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创建多线程(子线程服务函数不同)

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

 

 秒杀多线程第二篇CreateThread与_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;

}

 

 

 

 

你可能感兴趣的:(thread)