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

线程同步作业

挺好玩,有意思。

 

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

 

#include <Windows.h>
#include <iostream>

// 事件句柄 分别是 a b c
HANDLE hEvent[3] = { 0 };

DWORD WINAPI ThreadProc(LPVOID lpThreadParameter) {
    int now_id = (int)lpThreadParameter;
    int next_id = (now_id + 1) % 3;
    for (int i = 0; i < 10;i++) {
        WaitForSingleObject(hEvent[now_id], -1); // 激发态时才能继续执行
        printf("第%d遍:打印%c\n", i+1, 'A'+ now_id);
        if (next_id == 0) {
            printf("\n");
        }
        SetEvent(hEvent[next_id]); // 可以打印下一个了,下一个设置为激发态
        ResetEvent(hEvent[now_id]); // 设置为非激发态
        if (i == 9) {
            CloseHandle(hEvent[now_id]);
        }
    }
    return 0;
}


int main()
{
    // 第一个参数安全属性默认即可:NULL
    // 第二个参数 TRUE表示程序员自己控制状态
    //            FALSE表示,WaitForSingleObject后自动改为非激发态
    // 第三个参数为初始状态, TRUE表示激发态,FALSE表示非激发态
    // 第四个参数为事件名称
    hEvent[0] = CreateEvent(NULL, TRUE, TRUE, L"print_a");
    hEvent[1] = CreateEvent(NULL, TRUE, FALSE, L"print_b");
    hEvent[2] = CreateEvent(NULL, TRUE, FALSE, L"print_c");

    // 创建3线程
    DWORD dThreadId1 = 0;
    HANDLE hThread1 = CreateThread(NULL, NULL, ThreadProc, (LPVOID)0, NULL, &dThreadId1);

    DWORD dThreadId2 = 0;
    HANDLE hThread2 = CreateThread(NULL, NULL, ThreadProc, (LPVOID)1, NULL, &dThreadId2);

    DWORD dThreadId3 = 0;
    HANDLE hThread3 = CreateThread(NULL, NULL, ThreadProc, (LPVOID)2, NULL, &dThreadId2);

    //它的意思是好戏开始
    printf("Good Drama Start\n");
    getchar();
    return 0;
}

 

posted @ 2022-08-28 19:44  荒口巨笔  阅读(526)  评论(0)    收藏  举报