一道经典多线程题
来源:互联网 发布:周扬青开的淘宝店铺 编辑:程序博客网 时间:2024/05/02 16:16
问题的描述
启动3个线程打印递增的数字, 线程1先打印1,2,3,4,5, 然后是线程2打印6,7,8,9,10, 然后是线程3打印11,12,13,14,15. 接着再由线程1打印16,17,18,19,20....以此类推, 直到打印到75. 程序的输出结果应该为:
线程1: 1
线程1: 2
线程1: 3
线程1: 4
线程1: 5
线程2: 6
线程2: 7
线程2: 8
线程2: 9
线程2: 10
...
线程3: 71
线程3: 72
线程3: 73
线程3: 74
线程3: 75
java实现见http://coolxing.iteye.com/blog/1236696
这里我用c++实现。大致思路跟http://blog.csdn.net/jlncu/article/details/8891978里的差不多,代码结构一样。
线程顺次触发,全局变量每次加1,每个线程输出5个数后触发下个线程。
#include <windows.h>#include <iostream>using namespace std;const int THREAD_NUM = 3;//线程个数 HANDLE g_hThreadEvent[THREAD_NUM]; //互斥事件 int LOOP = 1;DWORD WINAPI fun1(LPVOID lpParam);DWORD WINAPI fun2(LPVOID lpParam);DWORD WINAPI fun3(LPVOID lpParam);void main(){int i = 0;HANDLE hdl[THREAD_NUM];//线程句柄//事件开启的时候是没有触发的 for (int i = 0; i < THREAD_NUM; i++) g_hThreadEvent[i] = CreateEvent(NULL,FALSE,FALSE,NULL); //线程句柄hdl[0] = ::CreateThread(NULL, 0, fun1, NULL, 0, NULL); hdl[1] = ::CreateThread(NULL, 0, fun2, NULL, 0, NULL); hdl[2] = ::CreateThread(NULL, 0, fun3, NULL, 0, NULL); //触发第一个线程,线程函数会按顺序自己触发下一个要执行的线程 SetEvent(g_hThreadEvent[0]); WaitForMultipleObjects(THREAD_NUM , hdl, TRUE, INFINITE); //清理 for (i = 0; i < THREAD_NUM; i++) { CloseHandle(hdl[i]); CloseHandle(g_hThreadEvent[i]); } getchar();}DWORD WINAPI fun1(LPVOID lpParam){while(true){WaitForSingleObject(g_hThreadEvent[0],INFINITE);if(LOOP < 76){int i = 0;while(i < 5){cout<<"线程1:"<<LOOP++<<endl;i++;}::SetEvent(g_hThreadEvent[1]);}else{break;}}return 0;}DWORD WINAPI fun2(LPVOID lpParam){while(true){WaitForSingleObject(g_hThreadEvent[1],INFINITE); if(LOOP < 76){int i = 0;while(i < 5){cout<<"线程2:"<<LOOP++<<endl;i++;}::SetEvent(g_hThreadEvent[2]);}else{break;}}return 0;}DWORD WINAPI fun3(LPVOID lpParam){while(true){WaitForSingleObject(g_hThreadEvent[2],INFINITE); if(LOOP < 76){int i = 0;while(i < 5){cout<<"线程3:"<<LOOP++<<endl;i++;}::SetEvent(g_hThreadEvent[0]);}else{break;}}return 0;
- 一道经典多线程题
- 一道经典的Java多线程编程题
- 一道经典的Java多线程编程题
- 一道经典的Java多线程编程题
- 一道经典的Java多线程编程题
- 一道很经典的多线程面试题
- 一道经典内存题
- 一道经典小题
- 一道经典内存题
- 一道java多线程题
- 一道java多线程题
- 一道多线程笔试题
- 多线程一道小题
- java并发编程--一道经典多线程题的2种解法
- java并发编程--一道经典多线程题的2种解法
- java并发编程--一道经典多线程题的2种解法
- 一道经典的笔试题
- 一道经典面试小题
- 网站安全检测:推荐8款免费的 Web 安全测试工具
- 红黑树插入和删除结点的全程演示
- ORACLE常见问题
- Android错误异常收集
- 【销毁窗口】关键消息和方法
- 一道经典多线程题
- 红黑树的c++完整实现源码
- wave文件格式
- hdu 1052 贪心
- Doxygen的使用总结
- 3版本管理工具svn
- zoj3657-The Little Girl who Picks Mushrooms
- 谈谈数组的潜在越界行为
- HDOJ 2673