• 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;
    }
  • 相关阅读:
    图文讲解 sqlserver 2000 评测版 数据库过期 的解决方法
    SUSE shell环境语言设置
    Sleep Sort (休眠排序)
    骨干网…
    Linux下随机数
    爱吃苹果的与喜欢篮球的没必要非得达成一致~
    复杂的中国网络.....
    blog迁来迁去的......
    关于application/xwwwformurlencoded的说明
    The Art of Unix Programming
  • 原文地址:https://www.cnblogs.com/zhangmo/p/16446263.html
Copyright © 2020-2023  润新知