#include <windows.h>
#include <process.h>
#include "stdio.h"
#include <iostream>
using namespace std;
const int THREAD_NUM = 4;
HANDLE g_ThreadEvent[THREAD_NUM];
HANDLE g_OK;
unsigned int __stdcall Fun(void *pPM);
string g_write;
//int g_index = 0;
CRITICAL_SECTION g_cs;
int g_loop = 1;
void StartThread();
int main()
{
int innum=4;
while (cin>>innum)
{
g_loop = innum;
StartThread();
g_write.clear();
}
return 0;
}
void StartThread()
{
InitializeCriticalSection(&g_cs);
//1.创建互斥事件
for (int i = 0; i < THREAD_NUM; i++)
{
g_ThreadEvent[i] = CreateEvent(NULL, FALSE, FALSE, NULL);
}
g_OK = CreateEvent(NULL, FALSE, FALSE, NULL);
//2.创建线程
HANDLE hdl[THREAD_NUM];
for (int i = 0; i < THREAD_NUM; i++)
{
hdl[i] = (HANDLE)_beginthreadex(NULL, 0, Fun, (void*)i, 0, NULL);
}
//3.激活线程1
SetEvent(g_ThreadEvent[0]);
//4.等待所有的线程完成赋值
WaitForSingleObject(g_OK, INFINITE);
//g_write[g_index] = '\0';
cout << g_write.c_str() << endl;
//销毁线程
for (int i = 0; i < THREAD_NUM; i++)
{
CloseHandle(hdl[i]);
CloseHandle(g_ThreadEvent[i]);
}
DeleteCriticalSection(&g_cs);
}
unsigned int __stdcall Fun(void *pPM)
{
int num = (int)pPM;
for (int i = 0; i < g_loop;i++)
{
WaitForSingleObject(g_ThreadEvent[num], INFINITE);
EnterCriticalSection(&g_cs);
//printf(" 线程%d正在输入字符%c\n", num + 1, num + 'A');
g_write += num + 'A';
/*if (num+1==THREAD_NUM)
{
printf("\n");
}*/
LeaveCriticalSection(&g_cs);
SetEvent(g_ThreadEvent[(num + 1) % THREAD_NUM]);
}
if (num + 1 == THREAD_NUM)
{
SetEvent(g_OK);
}
return 0;
}