线程同步之事件对象

概念

事件对象也属于内核对象

我们看下它的参数

HANDLE CreateEventW(
    _In_opt_ LPSECURITY_ATTRIBUTES lpEventAttributes,
    _In_ BOOL bManualReset,
    _In_ BOOL bInitialState,
    _In_opt_ LPCWSTR lpName
    );

第一个参数表示安全属性,一般设置为null

第二个表示复位方式  ,TRUE 必须用 ResetEvent 手动复原 ,FALSE,自动还原为无信号状态

第三个表示 初始状态,TRUE 初始状态为有信号状态,FALSE无信号状态

第四个对象名称,一般设置为NULL,表示 无名的事件对象

用法

通过 SetEvent 设置为有信号状态, ResetEvent 设置为无信号状态,通过waitforsignleobject等待

代码

int main()
{
    HANDLE hThreadA, hThreadB;
    hThreadA = CreateThread ( NULL , 0 ,SellTicketA, NULL , 0, 0);
    hThreadB = CreateThread ( NULL , 0, SellTicketB, NULL , 0, 0);
   
    CloseHandle (hThreadA); 
    CloseHandle (hThreadB);
    
    g_hEvent = CreateEvent ( NULL , FALSE , FALSE , NULL );
    SetEvent (g_hEvent);
    
    Sleep (4000);
    CloseHandle (g_hEvent);
    system ("pause");
    return 0;
}

这里首先创建了两个线程,A代表A售票厅,B代表B售票厅,然后创建事件,一开始第三个参数设置为无信号,调用 SetEvent 把对象设置为有信号状态,然后随机执行主线程和子线程

线程B的代码

DWORD WINAPI SellTicketB(void* lpParam)
{
    while (1)
    {
    WaitForSingleObject (g_hEvent, INFINITE );
        if (iTickets > 0)
        {
            Sleep (1);
            iTickets--;
            printf ("B remain %d\n", iTickets);
        }
        else
        {
            break;
        }
   SetEvent (g_hEvent);
    }
return 0;
}

线程A的代码和线程B的代码差不多,没什么区别,关于这行代码的解释,请移步我的问题,我的问题有更清晰的回答

关于对象事件不解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值