【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;
}