操作系统进程同步—PV机制

四个进程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_**);之后立即显示分享文件,造成乱序输出。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值