四个进程ABCD共享一个文件,要求可以多进程共享文件,但AC、BD不能同时共享文件。
/*四个进程A、B、C、D、都要读一个共享文件F,系统允许多个进程同时读文件F,但限制是:
进程A和进程C不能同时读文件F
进程B和进程D不能同时读文件F
为了使这四个进程并发执行时能按照系统要求执行文件,用PV操作编写相关程序*/
#include<iostream>
#include<windows.h>
using namespace std;
typedef int semaphore;
semaphore flag_ac = 1;
semaphore flag_bd = 1;
void P(int &flag)
{
while (flag <= 0)
{
//cout << "file is sharing by other process!" << endl;
//Sleep(100);
}
flag -= 1;
}
void V(int &flag)
{
flag += 1;
}
DWORD WINAPI Thread_A(PVOID pvParam)
{
while (true)
{
P(flag_ac);
Sleep(10);
cout << "A is sharing file!" << endl;
Sleep(700);
V(flag_ac);
cout << "A finished!" << endl;
}
}
DWORD WINAPI Thread_B(PVOID pvParam)
{
while (true)
{
P(flag_bd);
Sleep(10);
cout << "B is sharing file!" << endl;
Sleep(800);
V(flag_bd);
cout << "B finished!" << endl;
}
}
DWORD WINAPI Thread_C(PVOID pvParam)
{
while (true)
{
P(flag_ac);
Sleep(10);
cout << "C is sharing file!" << endl;
Sleep(900);
V(flag_ac);
cout << "C finished!" << endl;
}
}
DWORD WINAPI Thread_D(PVOID pvParam)
{
while (true)
{
P(flag_bd);
Sleep(10);
cout << "D is sharing file!" << endl;
Sleep(1000);
V(flag_bd);
cout << "D finished!" << endl;
}
}
int main(int argc, char* argv[])
{
HANDLE ThreadHandle1 = CreateThread(NULL, 0, Thread_A, NULL, 0, NULL);
HANDLE ThreadHandle2 = CreateThread(NULL, 0, Thread_B, NULL, 0, NULL);
HANDLE ThreadHandle3 = CreateThread(NULL, 0, Thread_C, NULL, 0, NULL);
HANDLE ThreadHandle4 = CreateThread(NULL, 0, Thread_D, NULL, 0, NULL);
while (true)
{
if (getchar() == 'q')
{
CloseHandle(ThreadHandle1);
CloseHandle(ThreadHandle2);
CloseHandle(ThreadHandle3);
CloseHandle(ThreadHandle4);
return 0;
}
}
system("pause");
return 0;
}
要想实现进程AB、AD、BC、CD的并发执行,我们让ABCD进程信号量为1时,睡眠不同的时间,这里我设置的是Sleep(700)~Sleep(1000)
,如果设置睡眠的时间相同,你会发现总是两个相同的进程在执行,另外两个进程等待,不断循环。此外,每一个cout<<"* is sharing file!"<<endl;
之前我设置了Sleep(10)
短暂的睡眠,保证在进入一个与之互斥的进程之前,cout<<"* finished!"<<endl;
有时间显示在控制台上,否则,等待的互斥进程在操作V(flag_**);
之后立即显示分享文件,造成乱序输出。