问题:
有四个线程1、2、3、4。线程1的功能就是输出1,线程2的功能就是输出2,以此类推.........现在有四个文件ABCD。初始都为空。现要让四个文件呈如下格式:
A:1 2 3 4 1 2....
B:2 3 4 1 2 3....
C:3 4 1 2 3 4....
D:4 1 2 3 4 1....
请设计程序。
#include <fstream>
/*
整体思想如下:关键段实现对一个文件的互斥操作,用事件实现线程间同步
至于事件与文件的对应关系,通过两个数组FileNow,NextFile来巧妙关联
一个num始终对应一个event,对应一个Thread,FileNow与数组NextFile表示文件序列
通过修改文件序列,实现Thread向不同文件书写
*/
const int FILE_COUNT =4;
const int EVENT_COUNT = 4;
const int THREAD_COUNT = 4;
CRITICAL_SECTION g_CS;
HANDLE g_events[EVENT_COUNT];
ofstream File[4];//4个文件
int FileNow[] = {0,1,2,3};
int NextFile[]={0,1,2,3};
unsigned int __stdcall ThreadFunc(LPVOID param)
{
int num = (int)param;//获取线程序列
for (int i = 0; i<4; i++)
{
WaitForSingleObject(g_events[num],INFINITE);//申请到与该线程相对应的事件
EnterCriticalSection(&g_CS);//进入共享段,互斥实现对文件的操作
printf("线程%d正在向文件%c写入\n",num+1,FileNow[num]+'A');
File[FileNow[num]]<<num+1<<' ';//序列号为num的线程向序列号为FileNow[num]的文件写入,也就是说哪个线程向哪个文件里写取决于FileNow[num]
NextFile[(num+1)%FILE_COUNT] = FileNow[num];//改变下一轮写顺序
Sleep(200);
if (num+1 == FILE_COUNT)//一轮完毕
{
cout <<'\n';
memcpy(FileNow,NextFile,sizeof(NextFile));
}
LeaveCriticalSection(&g_CS);
SetEvent(g_events[(num+1)%EVENT_COUNT]);
}
return 0;
}
int main(int argc, char **argv)
{
char fileName[] = "A.txt";
for(int i = 0; i<FILE_COUNT; ++i)//创建4个文件
{
fileName[0]=i+'A';//不同的命名
File[i].open(fileName,ios::trunc);
if (File[i].fail())
{
cout <<"文件打开失败"<<endl;
return -1;
}
}
InitializeCriticalSection(&g_CS);//初始化关键段,实现对一个文件的互斥操作
for (int i =0;i <EVENT_COUNT; ++i)
{
g_events[i] = CreateEvent(NULL,false,false,NULL);
}
SetEvent(g_events[0]);//手动设置事件0为释放状态,这样各线程就不陷于死等状态
HANDLE hdl[THREAD_COUNT];
for (int i = 0; i<THREAD_COUNT; ++i)
{
hdl[i] = (HANDLE)_beginthreadex(NULL,0,ThreadFunc,(LPVOID)i,0,NULL);//i就表示线程序列,将此序列通过参数传入线程函数,该函数通过参数辨别是哪个线程
}
WaitForMultipleObjects(THREAD_COUNT,hdl,true,INFINITE);
//释放资源
for (int i = 0; i<EVENT_COUNT; ++i)
{
CloseHandle(g_events[i]);
CloseHandle(hdl[i]);
}
for (int i = 0; i<FILE_COUNT; ++i)
{
File[i].close();
}
DeleteCriticalSection(&g_CS);
return 0;
}
文章参考:http://blog.csdn.net/lilien1010/article/details/8119325