问题的描述
启动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;