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