题目:编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推
my_typedef.h
<span style="font-size:18px;">#ifndef MY_TYPEDEF_H
#define MY_TYPEDEF_H
typedef char CHAR;
typedef signed char INT8;
typedef signed short INT16;
typedef signed int INT32;
//typedef signed long LONG64;
typedef unsigned char UINT8;
typedef unsigned short UINT16;
typedef unsigned int UINT32;
//typedef unsigned long ULONG64;
typedef float FLOAT;
typedef double DOUBLE;
#define OSM_Strncpy strncpy
#define OSM_Strncmp strncmp
#define OSM_Strncat strncat
#define OSM_Printf printf
#define OSM_Getchar getchar
#define OSM_Scanf scanf
#endif</span>
main.c
<span style="font-size:18px;"><span style="font-size:14px;">unsigned int __stdcall MyProc1(LPVOID lpParam);
unsigned int __stdcall MyProc2(LPVOID lpParam);
unsigned int __stdcall MyProc3(LPVOID lpParam);
HANDLE tHandleThread[3] = {NULL, NULL, NULL}; //线程句柄
HANDLE tHandleEvent[3] = {NULL, NULL, NULL}; //事件对象句柄
unsigned int pThreadId[3] = {0, 0, 0}; //线程ID
INT32 i32DoNothing = 0;
INT32 main()
{
INT32 i32I = 0;
// 定义3个事件对象,并保存其句柄
tHandleEvent[0] = CreateEvent(NULL, TRUE, FALSE, NULL);
tHandleEvent[1] = CreateEvent(NULL, TRUE, TRUE, NULL);
tHandleEvent[2] = CreateEvent(NULL, TRUE, TRUE, NULL);
// 创建3个线程,并保存线程句柄
tHandleThread[0] = (HANDLE)_beginthreadex(NULL, 0, MyProc1, NULL, 0, &pThreadId[0]);
tHandleThread[1] = (HANDLE)_beginthreadex(NULL, 0, MyProc2, NULL, 0, &pThreadId[1]);
tHandleThread[2] = (HANDLE)_beginthreadex(NULL, 0, MyProc3, NULL, 0, &pThreadId[2]);
// 等待3个线程执行完毕,即每个线程打印完毕
WaitForMultipleObjects(3UL, tHandleThread, TRUE, INFINITE);
// 关闭事件对象
for (i32I = 0; i32I < 3; ++i32I)
{
i32DoNothing = CloseHandle(tHandleEvent[i32I]);
}
// 关闭线程
for (i32I = 0; i32I < 3; ++i32I)
{
i32DoNothing = CloseHandle(tHandleThread[i32I]);
}
#if 1
system("pause");
#endif
return 0;
}
unsigned int __stdcall MyProc1(LPVOID lpParam)
{
INT32 i32I = 0;
for (; i32I < 10; ++i32I)
{
// 等待第二个和第三个线程各自打印一次自己的线程ID
WaitForMultipleObjects(2UL, &tHandleEvent[1], TRUE, INFINITE);
// 打印一次该线程ID
printf("%d \n", pThreadId[0]);
// 将事件对象重置为未激活状态
i32DoNothing = ResetEvent(tHandleEvent[1]);
i32DoNothing = SetEvent(tHandleEvent[0]);
// 将事件对象变成激活状态
}
return 0UL;
}
unsigned int __stdcall MyProc2(LPVOID lpParam)
{
INT32 i32I = 0;
HANDLE tHandleTempEvent[2];
tHandleTempEvent[0] = tHandleEvent[0];
tHandleTempEvent[1] = tHandleEvent[2];
for (; i32I < 10; ++i32I)
{
// 等待第一个和第三个线程各打印一次自己的线程ID
WaitForMultipleObjects(2UL, tHandleTempEvent, TRUE, INFINITE);
printf("%d \n", pThreadId[1]);
i32DoNothing = ResetEvent(tHandleEvent[2]);
i32DoNothing = SetEvent(tHandleEvent[1]);
}
return 0UL;
}
unsigned int __stdcall MyProc3(LPVOID lpParam)
{
INT32 i32I = 0;
for (; i32I < 10; ++i32I)
{
// 等待第一个和第二个线程各打印一次自己的线程ID
WaitForMultipleObjects(2UL, tHandleEvent, TRUE, INFINITE);
printf("%d \n", pThreadId[2]);
i32DoNothing = ResetEvent(tHandleEvent[0]);
i32DoNothing = SetEvent(tHandleEvent[2]);
}
return 0UL;
}</span><strong style="font-size:24px;">
</strong></span>