Windows下父亲儿子女儿放取水果进程同步的演示程序

问题描述

桌上有一空盘,最多允许存放一个水果。爸爸可向盘中放一个苹果或放一个桔子,儿子专等吃盘中的桔子,女儿专等吃苹果。试用P、V操作实现爸爸、儿子、女儿三个并发进程的同步。提示:设置一个信号量表示可否向盘中放水果,一个信号量表示可否取桔子,一个信号量表示可否取苹果。

代码

#include<iostream>
#include<windows.h>
using namespace std; 

HANDLE g_apple = 0;//女儿线程互斥:表示可否取苹果
HANDLE g_orange = 0;//儿子线程互斥:表示可否取桔子
HANDLE g_hMutex = 0; //父亲线程互斥:表示可否向盘中放水果

bool g_continue = true; //控制程序运行和结束
DWORD WINAPI Father(LPVOID); //父亲线程
DWORD WINAPI Son(LPVOID);//儿子线程
DWORD WINAPI Daughter(LPVOID);//女儿线程


int main()
{
	//创建各个信号量
	g_orange = CreateSemaphore(NULL, 0, 1, NULL);
	g_apple = CreateSemaphore(NULL, 0, 1, NULL);
	g_hMutex = CreateSemaphore(NULL, 1, 1, NULL);

	DWORD threadID[3]; 
	HANDLE hThreads[3];

	//创建父亲线程
	hThreads[0] = CreateThread(NULL, 0, Father, NULL, 0, &threadID[0]);
	if (hThreads == NULL) return -1;
	//创建儿子线程
	hThreads[1] = CreateThread(NULL, 0, Son, NULL, 0, &threadID[1]);
	if (hThreads == NULL) return -1;
	//创建女儿线程
	hThreads[2] = CreateThread(NULL, 0, Daughter, NULL, 0, &threadID[2]);
	if (hThreads == NULL) return -1;

	while (g_continue){
		if (getchar()){  //按回车后终止程序运行
			g_continue = false;
		}
	}
	return 0;
}

//父亲线程 
DWORD WINAPI Father(LPVOID lpPara)
{
	while (g_continue){
		WaitForSingleObject(g_hMutex, INFINITE);
		int m = rand() % 2;
		if (m == 1) {
			std::cerr << "父亲放入一个苹果!" << std::endl;
			Sleep(1500);
			ReleaseSemaphore(g_apple, 1, NULL);
		}
		else{
			std::cerr << "父亲放入一个桔子!" << std::endl;
			Sleep(1500);
			ReleaseSemaphore(g_orange, 1, NULL);
		}

	}
	return 0;
}

//女儿线程
DWORD WINAPI Daughter(LPVOID lpPara)
{
	while (g_continue){
		WaitForSingleObject(g_apple, INFINITE);
		std::cerr << "女儿吃到一个苹果!" << std::endl;
		Sleep(1500);
		ReleaseSemaphore(g_hMutex, 1, NULL);
	}
	return 0;
}


//儿子线程
DWORD WINAPI Son(LPVOID lpPara)
{
	while (g_continue){
		WaitForSingleObject(g_orange, INFINITE);
		std::cerr << "儿子吃到一个桔子!" << std::endl;
		Sleep(1500);
		ReleaseSemaphore(g_hMutex, 1, NULL);
		
	}
	return 0;
}

运行结果

在这里插入图片描述

考虑盘子可放多个水果的同步代码演示

#include<iostream>
#include<windows.h>
#include<stdio.h>
using namespace std; 

HANDLE g_apple = 0;//女儿线程互斥:表示可否取苹果
HANDLE g_orange = 0;//儿子线程互斥:表示可否取桔子
HANDLE g_hMutex = 0; //父亲线程互斥:表示可否向盘中放水果
HANDLE g_hFullSemaphore = 0; //当缓冲区满时迫使生产者等待
HANDLE g_hEmptySemaphore = 0; //当缓冲区空时迫使消费者等待

bool g_continue = true; //控制程序运行和结束
DWORD WINAPI Father(LPVOID); //父亲线程
DWORD WINAPI Son(LPVOID);//儿子线程
DWORD WINAPI Daughter(LPVOID);//女儿线程


int main(){
	//创建各个信号量
	g_orange = CreateSemaphore(NULL, 0, 2, NULL);
	g_apple = CreateSemaphore(NULL, 0, 2, NULL);
	g_hMutex = CreateSemaphore(NULL, 1, 1 , NULL);

	g_hEmptySemaphore =CreateSemaphore(NULL,2, 2 ,NULL);
	g_hFullSemaphore =CreateSemaphore(NULL,0 ,2 ,NULL);

	DWORD threadID[4]; 
	HANDLE hThreads[4];

	//创建父亲线程
	hThreads[0] = CreateThread(NULL, 0, Father, NULL, 0, &threadID[0]);
	if (hThreads == NULL) return -1;
	
	hThreads[3] = CreateThread(NULL, 0, Father, NULL, 0, &threadID[3]);
	if (hThreads == NULL) return -1;

	//创建儿子线程
	hThreads[1] = CreateThread(NULL, 0, Son, NULL, 0, &threadID[1]);
	if (hThreads == NULL) return -1;
	//创建女儿线程
	hThreads[2] = CreateThread(NULL, 0, Daughter, NULL, 0, &threadID[2]);
	if (hThreads == NULL) return -1;

	while (g_continue){
		if (getchar()){  //按回车后终止程序运行
			g_continue = false;
		}
	}
	return 0;
}

//父亲线程 
DWORD WINAPI Father(LPVOID lpPara){
	while (g_continue){
		WaitForSingleObject(g_hEmptySemaphore,INFINITE);
		WaitForSingleObject(g_hMutex, INFINITE);
		int m = rand() % 2;
		if (m == 1) {
			printf("父亲放入一个苹果!\n");
			Sleep(2000);
			ReleaseSemaphore(g_apple, 1, NULL);
		}
		else{
			printf("父亲放入一个桔子!\n");
			Sleep(2000);
			ReleaseSemaphore(g_orange, 1, NULL);
		}
		ReleaseSemaphore(g_hMutex, 1, NULL);
		ReleaseSemaphore(g_hFullSemaphore, 1, NULL);
	}
	return 0;
}

//女儿线程
DWORD WINAPI Daughter(LPVOID lpPara){
	while (g_continue){
		WaitForSingleObject(g_apple, INFINITE);
		WaitForSingleObject(g_hFullSemaphore,INFINITE);
		printf("女儿吃到一个苹果!\n");
		Sleep(2000);
		ReleaseSemaphore(g_hMutex,1 ,NULL);
		ReleaseSemaphore(g_hEmptySemaphore,1,NULL);
	}
	return 0;
}


//儿子线程
DWORD WINAPI Son(LPVOID lpPara){
	while (g_continue){
		WaitForSingleObject(g_orange, INFINITE);
		WaitForSingleObject(g_hFullSemaphore,INFINITE);
		printf("儿子吃到一个桔子!\n");
		Sleep(2000);
		ReleaseSemaphore(g_hMutex,1 , NULL);
		ReleaseSemaphore(g_hEmptySemaphore,1,NULL);
	}
	return 0;
}

运行结果

在这里插入图片描述

参考

编写Windows下父亲儿子女儿放取水果进程同步的演示程序。(C/C++)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值