多线程的顺序执行(1)
2014-12-22 17:42
106 查看
题目:编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推
my_typedef.h
main.c
输出结果
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>
输出结果
相关文章推荐
- Linux C 多线程执行顺序问题
- Linux C 多线程执行顺序问题
- java多线程-使用notify和wait完成多线程的顺序执行
- 多线程执行顺序
- 多线程:控制多线程按顺序执行
- java多线程-使用notify和wait完成多线程的顺序执行
- 多线程执行顺序
- 多线程执行顺序
- java多线程-使用notify和wait完成多线程的顺序执行
- Linux C 多线程执行顺序问题
- J2SE多线程 part2 多线程的执行顺序
- Javaの线程之多线程执行顺序
- 多线程的六种状态与执行顺序以及在内存中如何运行
- java多线程-使用notify和wait完成多线程的顺序执行
- pthread_create多线程执行顺序诡异现象
- 多线程执行顺序、速度
- Java多线程系列四——控制线程执行顺序
- java控制多线程执行顺序
- java多线程学习之启动顺序不等于执行顺序
- 多线程执行顺序诡异现象谈,你不知道的pthread_create