• 多线程


    1.创建多线程

    • Windows下创建一个线程的方法有两种,一种就是调用Windows API CreateThread()来创建线程;另外一种就是调用MSVC CRT的函数_beginthread()或_beginthreadex()来创建线程。
    • 相应的退出线程也有两个函数Windows API的ExitThread()和CRT的_endthread()。
    • 根据Windows API和MSVC CRT的关系,可以看出来_beginthread()是对CreateThread()的包装,它最终还是调用CreateThread()来创建线程。
    • _beginthread的对应函数_endthread自动的调用了CloseHandle,而_beginthreadex的对应函数 _endthreadex则没有,所以CloseHandle无论如何都是要调用的不过_endthread可以帮你执行自己不必写,其他两种就需要自己 写!(Jeffrey Richter强烈推荐尽量不用显式的终止函数,用自然退出的方式,自然退出当然就一定要自己写CloseHandle)

    (1)  _beginthread(myfun, 0, NULL)

    (2)  CreatThread(NULL, 0, myfun, NULL,0,NULL)

    例子:

    #include <stdlib.h>
    #include <Windows.h>
    #include <process.h>
    
    void fun(void *p)
    {
        for(int i=0; i<100; i++)
        {
            num++;
        }
    }
    
    
    int main()
    {
        HANDLE hd[100];
        for(int i=0; i<100, i++)
        {
            hd[i]=_beginthread(myfun, 0, NULL);    //数组的每一个元素都是一个线程
            //WaitForSingleObject(hd[i], INFINITE);  //同步,完成一个线程,在进行下一个
    。表示该线程不结束,不会开始下一步
    } WaitForMultipleObjects(100, hd, TRUE, INFINITE); //等待所有线程退出 printf("%d", num); system("pause"); }



    同步线程有一个问题,如果一个线程的运行时间很长,那么全部完成,需要花费很长时间。


    并行进行,不同步运行多个线程,最后得到的结果是不精确的



    2.计时函数(头文件time.h)
    void main()
    {
    time_t start, end;
    time(&start);
    程序语句
    time(&end);
    printf("%f",difftime(end, start));

    }

    3.临界区(头文件是Windows.h),
    CRITICAL_SECTION cs;    //定义全局,起到了控制线程的作用
    一般用多线程原则上使用cpp
    EnterCriticalSection(&cs);    //进入临界区

    LeaveCriticalSection(&cs);    //离开临界区


    临界区他不是一个变量,它是调用操作系统,让线程进入临界区,锁定一个变量。


    beginthread你只能让他互锁,你如果想让他不发生冲突,需要另一种创建线程的方法,creatthread,它是windows内部的,参数比较多。
    DWORD WINAPI myfun(void *)    //这里的WINAPI表明是申请的操作系统所调度的这么个线程。
    {
        for(int i=0; i<100, i++)
        {
        EnterCriticalSection(&cs);
        num++;
        LeaveCriticalSection(&cs);
        }
    }        
    DeleteCriticalSection(&cs);









  • 相关阅读:
    Android开发自学笔记(Android Studio)—4.1布局组件
    交换机远程管理
    ThinkPHP开发博客系统笔记之二
    PHP编码规范
    Kali Linux学习笔记
    CSS编码规范
    ThinkPHP开发博客系统笔记之一
    2 Powershell与Cmd以及Unix/Linux Shell
    不同vlan间通信的三种配置方式
    配置超级用户口令(Cisco IOS系统)
  • 原文地址:https://www.cnblogs.com/sjxbg/p/5765130.html
Copyright © 2020-2023  润新知