C++ 多线程之临界区和事件

本文介绍了如何在Win32控制台应用程序中利用通知事件进行线程间的同步控制,通过实例展示了线程间数据交换的过程,以及如何确保线程安全。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前一篇学习了临界区的概念,但是没有线程控制力。在这里我加入了通知事件来进行线程同步控制的目的。

1. 创建Win32控制台应用程序

2. 加入以下代码

/*Thread.cpp*/

#include<stdio.h>
#include<process.h>
#include <Windows.h>

//线程临界区锁
class CCriticalSectionLock  
{  
public:  
    CCriticalSectionLock() { InitializeCriticalSection(&m_cs); }
    ~CCriticalSectionLock() { DeleteCriticalSection(&m_cs); }
    void Lock() { EnterCriticalSection(&m_cs); }
    void Unlock() { LeaveCriticalSection(&m_cs); }
private:  
    CRITICAL_SECTION    m_cs;
}; 

//增加值及锁
int g_AddValue  = 0;
CCriticalSectionLock g_lockAddValue;

//主线程退出状态及锁
bool g_MainThreadExit = false;
CCriticalSectionLock g_lockMainTreadExit;

//值增加事件
HANDLE    g_hOnValueAddedEvent;
//主线程退出事件
HANDLE  g_hMainThreadExitEvent; 

//主控制线程
void ThreadMain(void *arg)
{
    for(int i = 0; i<20; i++)
    {
        //主线程中增加值
        g_lockAddValue.Lock();
        g_AddValue ++;
        printf("g_AddValue在主线程中是: %d\n", g_AddValue);
        g_lockAddValue.Unlock();
        //发布值增加事件
        SetEvent(g_hOnValueAddedEvent);
    }
    //设置主线程退出状态
    g_lockMainTreadExit.Lock();
    g_MainThreadExit = true;
    g_lockMainTreadExit.Unlock();
    SetEvent(g_hOnValueAddedEvent);
    _endthread();
}

//工作线程1
void ThreadWorker1(void *arg)
{
    while(true)
    {
        //响应值增加事件
        WaitForSingleObject(g_hOnValueAddedEvent, INFINITE);
        g_lockAddValue.Lock();
        g_AddValue ++;
        printf("工作线程1: %d\n", g_AddValue);
        g_lockAddValue.Unlock();
        //事件响应完成
        ResetEvent(g_hOnValueAddedEvent);

        //检查状态
        g_lockMainTreadExit.Lock();
        bool bAppExit = g_MainThreadExit;
        g_lockMainTreadExit.Unlock();
        if(bAppExit)
            break;
    }
    //发布值增加事件
    SetEvent(g_hMainThreadExitEvent);
    _endthread();
}

//程序入口
void main()
{
    //初始化事件和关键段 自动置位,初始无触发的匿名事件  
    g_hOnValueAddedEvent = CreateEvent(NULL, FALSE, FALSE, NULL);  
    g_hMainThreadExitEvent = CreateEvent(NULL, FALSE, FALSE, NULL);  

    //开始线程
    _beginthread(ThreadMain,0,NULL);
    _beginthread(ThreadWorker1,0,NULL);

    //等待主线程退出
    WaitForSingleObject(g_hMainThreadExitEvent, INFINITE);
    ResetEvent(g_hMainThreadExitEvent);
}

注意:需要将 项目属性 -> 配置属性 -> C/C++ -> 代码生成 -> 运行时库 属性设置为多线程调试(多线程)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值