悉野小楼

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

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;
}
复制代码

 下载代码

posted on   悉野  阅读(645)  评论(0编辑  收藏  举报

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示