zoukankan      html  css  js  c++  java
  • 秒杀多线程第二篇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;
    }
    
  • 相关阅读:
    单例模式(上)单例常见的实现方式
    Netty(六)揭开 BootStrap 的神秘面纱
    Netty(五)Netty 高性能之道
    Netty(四)基于Netty 的简易版RPC
    Netty(三)基于Bio和Netty 的简易版Tomcat
    Netty(二)Netty 与 NIO 之前世今生
    java学习笔记
    Java使用笔记之对象比较
    React学习之受控和非受控组件
    SpringBoot学习之常用注解
  • 原文地址:https://www.cnblogs.com/yuqilihualuo/p/3016745.html
Copyright © 2011-2022 走看看