zoukankan      html  css  js  c++  java
  • MFC学习 事件临界区

    事件:

    #include <Windows.h>
    #include <iostream>
    DWORD WINAPI Func1Pro(LPVOID lpParameter);
    DWORD WINAPI Func2Pro(LPVOID lpParameter);
    int tickets = 100;
    HANDLE g_hEvent;
    void main()
    {
    
        HANDLE hThread1;
        HANDLE hThread2;
        hThread1 = CreateThread(NULL, 0, Func1Pro, NULL, 0, NULL);
        hThread2 = CreateThread(NULL, 0, Func2Pro, NULL, 0, NULL);
        CloseHandle(hThread1);
        CloseHandle(hThread2);
    //    g_hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); //人工重置的事件对象, 初始信号状态设置为无信号状态
        //g_hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); //自动重置事件对象, 初始信号状态设置为无信号状态
        g_hEvent = CreateEvent(NULL, FALSE, FALSE, "tickets"); 
        if(g_hEvent)
        {
            //带名字的事件对象也是系统唯一的, 可以判断实例
            if(ERROR_ALREADY_EXISTS == GetLastError())
            {
                std::cout<< "only instance can run!" << std::endl;
                return;
            }
        }
        SetEvent(g_hEvent);//人工重置的事件对象, 会将所有线程的事件信号状态都改变 ResetEvent改成无信号
        Sleep(4000);
        CloseHandle(g_hEvent);
    }
    DWORD WINAPI Func1Pro(LPVOID lpParameter)
    {
    
        while(TRUE)
        {
            WaitForSingleObject(g_hEvent, INFINITE); //如果是自动重置事件对象 处理时, 会改成非信号状态
            if(tickets > 0)
            {
                Sleep(1);
                std::cout << "thread1 sell ticket: " << tickets-- << std::endl;
            }
            else
                break;
            SetEvent(g_hEvent); //再设置为有信号状态
        }
        return 0;
    }
    DWORD WINAPI Func2Pro(LPVOID lpParameter)
    {
    
        while(TRUE)
        {
            WaitForSingleObject(g_hEvent, INFINITE);//如果是自动重置事件对象 处理时, 会改成非信号状态
            if(tickets > 0)
            {
                Sleep(1);
                std::cout << "thread2 sell ticket: " << tickets-- << std::endl;
            }
            else
                break;
            SetEvent(g_hEvent); //再设置为有信号状态
        }
        return 0;
    }

    临界区:

    #include <Windows.h>
    #include <iostream>
    DWORD WINAPI Func1Pro(LPVOID lpParameter);
    DWORD WINAPI Func2Pro(LPVOID lpParameter);
    int tickets = 100;
    CRITICAL_SECTION g_cs;
    void main()
    {
    
        HANDLE hThread1;
        HANDLE hThread2;
        hThread1 = CreateThread(NULL, 0, Func1Pro, NULL, 0, NULL);
        hThread2 = CreateThread(NULL, 0, Func2Pro, NULL, 0, NULL);
        CloseHandle(hThread1);
        CloseHandle(hThread2);
        InitializeCriticalSection(&g_cs); //初始化临界区对象
        Sleep(4000);
        DeleteCriticalSection(&g_cs);
    }
    DWORD WINAPI Func1Pro(LPVOID lpParameter)
    {
    
        while(TRUE)
        {
            EnterCriticalSection(&g_cs); //检查是否能进入临界区
            if(tickets > 0)
            {
                Sleep(1);
                std::cout << "thread1 sell ticket: " << tickets-- << std::endl;
            }
            else
                break;
            LeaveCriticalSection(&g_cs);
            
        }
        return 0;
    }
    DWORD WINAPI Func2Pro(LPVOID lpParameter)
    {
    
        while(TRUE)
        {
            EnterCriticalSection(&g_cs);
            if(tickets > 0)
            {
                Sleep(1);
                std::cout << "thread2 sell ticket: " << tickets-- << std::endl;
            }
            else
                break;
            LeaveCriticalSection(&g_cs);
        }
        return 0;
    }

     下载代码

  • 相关阅读:
    用python2和python3伪装浏览器爬取网页
    详解python2 和 python3的区别[附实例]
    两种判断(抓取)网页编码的方法【python版】
    python用两种方法实现url短连接
    2013年1月编程语言排行榜榜单: ObjectiveC继续增长
    年初给力!教你自己动手做手机APP应用!!
    [原创]用python求第1000个质数的值
    linux下如何安装配置redis及主从配置
    第四次博客作业结对项目
    2sat的一些总结
  • 原文地址:https://www.cnblogs.com/barrysgy/p/3227419.html
Copyright © 2011-2022 走看看