有四个线程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....
请设计程序。
思路:
使用一个互斥量实现文件访问的互斥性,使用两个int型变量实现线程的同步。
代码:
#include<Windows.h>
#include<iostream>
#include<fstream>
using namespace std;
HANDLE hMutex;
int file_flag=0;
int proc_flag=0;
ofstream fcout;
DWORD WINAPI proc1(LPVOID lp1);
DWORD WINAPI proc2(LPVOID lp2);
DWORD WINAPI proc3(LPVOID lp3);
DWORD WINAPI proc4(LPVOID lp4);
void main()
{
fcout.open("A.txt", ios::trunc);
fcout.close();
fcout.open("B.txt", ios::trunc);
fcout.close();
fcout.open("C.txt", ios::trunc);
fcout.close();
fcout.open("D.txt", ios::trunc);
fcout.close();
hMutex=CreateMutex(NULL, 0, NULL);
HANDLE hThread1=CreateThread(NULL, 0, proc1, NULL, 0, NULL);
HANDLE hThread2=CreateThread(NULL, 0, proc2, NULL, 0, NULL);
HANDLE hThread3=CreateThread(NULL, 0, proc3, NULL, 0, NULL);
HANDLE hThread4=CreateThread(NULL, 0, proc4, NULL, 0, NULL);
system("pause");
}
DWORD WINAPI proc1(LPVOID lp1)
{
bool flag=false;
int cnt=0;
while(cnt<10)
{
WaitForSingleObject(hMutex, INFINITE);
if(file_flag==0 && proc_flag==0)
{
flag=true;
fcout.open("A.txt", ios::app | ios::ate);
}
if(file_flag==1 && proc_flag==3)
{
flag=true;
fcout.open("D.txt", ios::app | ios::ate);
}
if(file_flag==2 && proc_flag==2)
{
flag=true;
fcout.open("C.txt", ios::app | ios::ate);
}
if(file_flag==3 && proc_flag==1)
{
flag=true;
fcout.open("B.txt", ios::app | ios::ate);
}
if(flag)
{
fcout<<1<<" ";
if(proc_flag==3)
file_flag=(file_flag+1)%4;
proc_flag=(proc_flag+1)%4;
flag=false;
cnt++;
fcout.close();
}
ReleaseMutex(hMutex);
}
return 0;
}
DWORD WINAPI proc2(LPVOID lp2)
{
bool flag=false;
int cnt=0;
while(cnt<10)
{
WaitForSingleObject(hMutex, INFINITE);
if(file_flag==0 && proc_flag==1)
{
flag=true;
fcout.open("B.txt", ios::app | ios::ate);
}
if(file_flag==1 && proc_flag==0)
{
flag=true;
fcout.open("A.txt", ios::app | ios::ate);
}
if(file_flag==2 && proc_flag==3)
{
flag=true;
fcout.open("D.txt", ios::app | ios::ate);
}
if(file_flag==3 && proc_flag==2)
{
flag=true;
fcout.open("C.txt", ios::app | ios::ate);
}
if(flag)
{
fcout<<2<<" ";
if(proc_flag==3)
file_flag=(file_flag+1)%4;
proc_flag=(proc_flag+1)%4;
flag=false;
cnt++;fcout.close();
}
/*if(cnt==99)
{
int x=0;
}*/
ReleaseMutex(hMutex);
}
return 0;
}
DWORD WINAPI proc3(LPVOID lp3)
{
bool flag=false;
int cnt=0;
while(cnt<10)
{
WaitForSingleObject(hMutex, INFINITE);
if(file_flag==0 && proc_flag==2)
{
flag=true;
fcout.open("C.txt", ios::app | ios::ate);
}
if(file_flag==1 && proc_flag==1)
{
flag=true;
fcout.open("B.txt", ios::app | ios::ate);
}
if(file_flag==2 && proc_flag==0)
{
flag=true;
fcout.open("A.txt", ios::app | ios::ate);
}
if(file_flag==3 && proc_flag==3)
{
flag=true;
fcout.open("D.txt", ios::app | ios::ate);
}
if(flag)
{
fcout<<3<<" ";
if(proc_flag==3)
file_flag=(file_flag+1)%4;
proc_flag=(proc_flag+1)%4;
flag=false;
cnt++;fcout.close();
}
ReleaseMutex(hMutex);
}
return 0;
}
DWORD WINAPI proc4(LPVOID lp4)
{
bool flag=false;
int cnt=0;
while(cnt<10)
{
WaitForSingleObject(hMutex, INFINITE);
if(file_flag==0 && proc_flag==3)
{
flag=true;
fcout.open("D.txt", ios::app | ios::ate);
}
if(file_flag==1 && proc_flag==2)
{
flag=true;
fcout.open("C.txt", ios::app | ios::ate);
}
if(file_flag==2 && proc_flag==1)
{
flag=true;
fcout.open("B.txt", ios::app | ios::ate);
}
if(file_flag==3 && proc_flag==0)
{
flag=true;
fcout.open("A.txt", ios::app | ios::ate);
}
if(flag)
{
fcout<<4<<" ";
if(proc_flag==3)
file_flag=(file_flag+1)%4;
proc_flag=(proc_flag+1)%4;
flag=false;
cnt++;fcout.close();
}
ReleaseMutex(hMutex);
}
return 0;
}