C++ 线程同步event事件

线程的执行是随机时间片的,如果要控制线程间同步执行,需要做同步。

event事件:是一个内核对象,事件对象包含引用计数、事件类型、事件的通知状态等信息。主要分为2种,人工重置对象和自动重置对象。人工重置,则需要开发人员自行调用ResetEvent设置成无信号状态;自动重置,则当等待对象有信号后系统自动重置该事件对象成无信号状态。

下面编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。 思路:A->B->C->A...

复制代码
HANDLE hEventA,hEventB,hEventC;
HANDLE szThread[3];

DWORD WINAPI ThreadProcA(LPVOID lpParam)
{
//    printf("inThreadA ...\n");
    for(int i=0; i<10;i++)
    {
        WaitForSingleObject(hEventA,INFINITE);
        printf("A");
        SetEvent(hEventB);
    }
//    printf("inThreadA exitA\n");
    return 1;
}

DWORD WINAPI ThreadProcB(LPVOID lpParam)
{
//    printf("inThreadB ...\n");
    for(int i=0; i<10;i++)
    {
        WaitForSingleObject(hEventB,INFINITE);
        printf("B");
        ResetEvent(hEventB);//手动事件
        SetEvent(hEventC);
    }
//    printf("inThreadA exitB\n");
    return 1;
}

DWORD WINAPI ThreadProcC(LPVOID lpParam)
{
//    printf("inThreadC ...\n");
    for(int i=0; i<10;i++)
    {
        WaitForSingleObject(hEventC,INFINITE);
        printf("C");
        SetEvent(hEventA);
    }
    printf("\n");
//    printf("inThreadC exitC\n");
    return 1;
}

void testABC()
{
    printf("create events ...\n");
    hEventA = CreateEventA(0,FALSE,TRUE,0); // 初始有信号后自动无信号,等待c置为有信号,置b有信号
    hEventB = CreateEventA(0,TRUE,FALSE,0); // 初始无信号,等待A置为有信号后,手动置为无信号,置c为有信号
    hEventC = CreateEventA(0,FALSE,FALSE,0);// 初始无信号,等待B置为有信号后,自动至为无信号, 至a为有信号
    ResetEvent(hEventA);

    printf("create threads ...\n");
    szThread[2] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProcA, NULL, 0,NULL);
    szThread[1] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProcB, NULL, 0,NULL);
    szThread[0] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProcC, NULL, 0,NULL);

    printf("wait threads ...\n");
    SetEvent(hEventA);
    WaitForMultipleObjects(3,szThread,TRUE,INFINITE);
    printf("wait threads finished!\n");

    CloseHandle(szThread[0]);
        CloseHandle(szThread[1]);
            CloseHandle(szThread[2]);
                CloseHandle(hEventA);
                    CloseHandle(hEventB);
                        CloseHandle(hEventC);
}

//////////////////////////////////////////////////////////////////////////

int main(int argc, char* argv[])
{
    printf("Hello World!\n");

        testABC();
        return 0;
}
复制代码

 

posted @   晨光静默  阅读(432)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示