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;
    }

     下载代码

  • 相关阅读:
    Kakuro Extension HDU
    CodeForces
    HDU
    2019牛客暑期多校训练营(第二场)F.Partition problem
    UVA
    团队冲刺6
    团队冲刺4
    团队冲刺3
    团队冲刺2
    团队冲刺1
  • 原文地址:https://www.cnblogs.com/barrysgy/p/3227419.html
Copyright © 2011-2022 走看看