操作系统 实验6

本文通过C++代码展示了如何在Windows环境下利用互斥量和信号量解决读者写者问题,创建了一个写者线程和多个读者线程。在实现过程中遇到了类型不匹配、资源关闭错误等问题,并给出了相应的解决方案。同时,提供了获取系统当前物理内存和虚拟内存信息的代码,输出了内存使用情况的各项统计数据。
摘要由CSDN通过智能技术生成

使用互斥量和信号量解决读者-写者问题。程序中设置1个写者线程,5个读者线程。

(使用VS2022)

代码如下:

#include<stdio.h>
#include<process.h>
#include<windows.h>
#define READER_NUM 5
CRITICAL_SECTION g_cs, g_cs_writer_count;
HANDLE g_hEventWriter, g_hEventNoReader;
int g_nReaderCount;
void ReaderPrintf(char* pszFormat, ...)
{
	va_list pArgList;
	va_start(pArgList, pszFormat);
	EnterCriticalSection(&g_cs);
	vfprintf(stdout, pszFormat, pArgList);
	LeaveCriticalSection(&g_cs);
	va_end(pArgList);
}
unsigned int __stdcall ReaderThreadFun(PVOID pM)
{
	ReaderPrintf("编号为%d的读者进入等待中...\n", GetCurrentThreadId());
	WaitForSingleObject(&g_hEventWriter, INFINITE);
	EnterCriticalSection(&g_cs_writer_count);
	g_nReaderCount++;
	if (g_nReaderCount == 1)
	{
		ResetEvent(g_hEventNoReader);
	}
	LeaveCriticalSection(&g_cs_writer_count);
	ReaderPrintf("编号为%d的读者开始读取文件...\n", GetCurrentThreadId());
	Sleep(rand() % 100);
	ReaderPrintf("编号为%d的读者结束读取文件\n", GetCurrentThreadId());
	EnterCriticalSection(&g_cs_writer_count);
	g_nReaderCount--;
	if (g_nReaderCount == 0)
		SetEvent(g_hEventNoReader);
	LeaveCriticalSection(&g_cs_writer_count);
	return 0;
}
void WriterPrintf(char* pszStr)
{
	EnterCriticalSection(&g_cs);
	printf("%s\n", pszStr);
	LeaveCriticalSection(&g_cs);
}
unsigned int __stdcall WriterThreadFun(PVOID pM)
{
	WriterPrintf("---写者线程进入等待中...");
	WaitForSingleObject(g_hEventNoReader, INFINITE);
	ResetEvent(g_hEventWriter);
	WriterPrintf("---写者开始写文件.....");
	SetEvent(g_hEventWriter);
	return 0;
}
int main()
{
	int i;
	HANDLE hThread[READER_NUM + 1];
	printf("\t读者写者问题\n");
	InitializeCriticalSection(&g_cs);
	InitializeCriticalSection(&g_cs_writer_count);
	g_hEventWriter = CreateEvent(NULL, TRUE, TRUE, NULL);
	g_hEventNoReader = CreateEvent(NULL, FALSE, TRUE, NULL);
	g_nReaderCount = 0;
	for (i = 1; i <= 2; i++)
	{
		hThread[i] = (HANDLE)_beginthreadex(NULL, 0, ReaderThreadFun, NULL, 0, NULL);
	}
	Sleep(50);
	for (; i < READER_NUM; i++)
		hThread[i] = (HANDLE)_beginthreadex(NULL, 0, ReaderThreadFun, NULL, 0, NULL);
	WaitForMultipleObjects(READER_NUM + 1, hThread, TRUE, INFINITE);
	for (i = 0; i < READER_NUM + 1; i++)
		CloseHandle(hThread[i]);
	CloseHandle(g_hEventWriter);
	CloseHandle(g_hEventNoReader);
	DeleteCriticalSection(&g_cs);
	DeleteCriticalSection(&g_cs_writer_count);
	Sleep(5000);
	return 0;
}

出现问题1:

E0167 “const char *“ 类型的实参与 “char *“ 类型的形参不兼容

解决办法:在   项目->属性->C/C++->语言->符合模式中,把是改为否

出现问题2: 

运行结果:

解决方法:把CloseHandle()改为FindClose() 

出现问题3:

结果:

我真的解决不了了...... 

2、检测并显示系统当前物理内存和虚拟内存信息。

代码:

#include<windows.h>
#include<stdio.h>
#define DIV 1024
char* divisor = "K";
void main()
{
	MEMORYSTATUS stat;
	GlobalMemoryStatus(&stat);
	printf("MEMORYSTATUS 结构体长度 %1d bites \n", stat.dwLength);
	printf("已使用物理内存百分比 %1d %% \n", stat.dwMemoryLoad);
	printf("总物理内存 %1d%s bytes \n", stat.dwTotalPhys / DIV, divisor);
	printf("可用物理内存 %1d%s bytes \n", stat.dwAvailPhys / DIV, divisor);
	printf("总页面文件数 %1d%s bytes \n", stat.dwTotalPageFile / DIV, divisor);
	printf("可用页面文件数 %1d%s bytes \n", stat.dwAvailPageFile / DIV, divisor);
	printf("总虚拟内存 %1d %s bytes \n", stat.dwTotalVirtual / DIV, divisor);
	printf("可用虚拟内存 %1d%s bytes \n", stat.dwAvailVirtual / DIV, divisor);
	Sleep(10000);
}

 

结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值