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 @ 2022-07-05 14:15  晨光静默  阅读(415)  评论(0编辑  收藏  举报