进程同步与进程通信(#include <windows.h>)

这篇具有很好参考价值的文章主要介绍了进程同步与进程通信(#include <windows.h>)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

实验二  进程同步与进程通信

一、实验目的

二、实验内容

任务一、进程同步与互斥

任务二、进程通信


实验二  进程同步与进程通信

备注:大二(下)操作系统实验二

一、实验目的

 掌握基本的同步与互斥算法,理解P,V操作

 学习使用Windows中基本的同步对象,掌握相关API的使用方法

了解Windows中多线程的并发执行机制,实现进程的同步与互斥

了解Wndows进程间通信方法的典型类型,如命名管道、文件映射等,掌握进程间通信的基本原理

了解windows系统环境下的进程通信机制,熟悉windows系统提供的进程通信API

二、实验内容

实验环境:DEV C++

任务一、进程同步与互斥

1、使用临界区对象模拟售票功能

其中SellPro_1, SellPro_2两个函数分别对应两个售票进程,一次售出一张票

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

DWORD WINAPI SellPro_1(LPVOID  lpParameter);
DWORD WINAPI SellPro_2(LPVOID  lpParameter );
DWORD WINAPI SellPro_3(LPVOID  lpParameter );

int tickets = N;

CRITICAL_SECTION critical_sec;//定义关键区域

DWORD WINAPI SellPro_1(LPVOID  lpParameter )
{
	while(TRUE)
	{
		Sleep(1);
		
		EnterCriticalSection( &critical_sec);
		//进入关键区域
		if(tickets>0)
		{
			cout<< "thread1 sell ticket, remain: "<<--tickets<<endl;
		}
		else break;
		LeaveCriticalSection( &critical_sec);
		//离开关键区域
	}
	
	return 0;
}

DWORD WINAPI SellPro_2(LPVOID  lpParameter )
{
	while(TRUE)
	{
		Sleep(1);
		
		EnterCriticalSection( &critical_sec);
		//进入关键区域
		if(tickets>0)
		{
			cout<< "thread2 sell ticket, remain: "<<--tickets<<endl;
		}
		else break;
		LeaveCriticalSection( &critical_sec);
		//离开关键区域
	}
	
	return 0;
}

int main()
{
	HANDLE hThread1;
	HANDLE hThread2;

	InitializeCriticalSection(&critical_sec);//初始化关健区域
	
	hThread1 = CreateThread(NULL,0,SellPro_1,NULL,0,NULL);
	hThread2 = CreateThread(NULL,0, SellPro_2,NULL,0,NULL);
	
	CloseHandle(hThread1);
	CloseHandle(hThread2);
	
	Sleep(4000);
	
	return 0;
}

进程同步与进程通信(#include <windows.h>) 

2、使用信号量对象模拟售票功能

其中SellPro_1, SellPro_2两个函数分别对应两个售票进程,一次售出一张票

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

static HANDLE g_hSemaphore = INVALID_HANDLE_VALUE;
static int g_Count = 100;

DWORD WINAPI Thread_A(LPVOID lpParamter);
DWORD WINAPI Thread_B(LPVOID lpParamter);

DWORD WINAPI Thread_A(LPVOID lpParamter)
{
	long count;
	
	while(1)
	{
		WaitForSingleObject(g_hSemaphore,INFINITE);
		if(g_Count>0)
		cout<<"thread_A sell ticket, remain: "<<--g_Count<<endl;
		else break;
		ReleaseSemaphore(g_hSemaphore,1,&count);
		
		Sleep(10);
	}
	
	return 0;
}

DWORD WINAPI Thread_B(LPVOID lpParamter)
{
	long count;
	
	while(1)
	{
		WaitForSingleObject(g_hSemaphore,INFINITE);
		if(g_Count>0)
		cout<< "thread_B sell ticket, remain: "<<--g_Count<<endl;
		else break;
		ReleaseSemaphore(g_hSemaphore,1,&count);
		
		Sleep(10);
	}
	
	return 0;
}

int main(int argc, char** argv)
{
	HANDLE threadA = INVALID_HANDLE_VALUE;
	HANDLE threadB = INVALID_HANDLE_VALUE;
	
	g_hSemaphore = CreateSemaphore(NULL,1,20,TEXT( "semaphore"));
	
	threadA = CreateThread(NULL,0,Thread_A,NULL,0,NULL);
	threadB = CreateThread(NULL,0,Thread_B,NULL,0,NULL);
	
	system("pause");
	
	CloseHandle(threadA);
	CloseHandle(threadB);

	return 0;
}

进程同步与进程通信(#include <windows.h>)

3、简单的生产者--消费者问题

一个缓冲区,存放一个整型数据

#include <stdio.h>
#include <process.h>
#include <windows.h>

const int END_PRODUCE_NUMBER=20;
int g_Buffer;
CRITICAL_SECTION g_cs;
HANDLE g_hEventBufferEmpty, g_hEventBufferFull;

unsigned int __stdcall ProducerThreadFun(PVOID pM) //生产者进程
{
	int i;
	
	for (i=1;i<=END_PRODUCE_NUMBER;i++)
	{
		WaitForSingleObject(g_hEventBufferEmpty, INFINITE);
		EnterCriticalSection(&g_cs);
		g_Buffer=i;
		printf("生产者将数据%d放入缓冲区\n",i);
		LeaveCriticalSection(&g_cs);
		SetEvent(g_hEventBufferFull);
		
		Sleep (1000);
	}
	
	return 0;
}

unsigned int __stdcall ConsumerThreadFun(PVOID pM) //消费者进程
{
	int flag=1;
	
	while(flag)
	{		
		WaitForSingleObject(g_hEventBufferFull, INFINITE);
		EnterCriticalSection(&g_cs);
		printf("消费者从缓冲区中取出数据%d\n", g_Buffer);
		if(g_Buffer==END_PRODUCE_NUMBER) flag=0;
		LeaveCriticalSection(&g_cs);
		SetEvent(g_hEventBufferEmpty);
		
		Sleep(1000);
	}
	
	return 0;
}

int main()
{
	HANDLE hThread[2];
	
	printf("生产者消费者问题\n");
	
	InitializeCriticalSection(&g_cs);
	g_hEventBufferEmpty=CreateEvent(NULL, FALSE, TRUE, NULL);
	g_hEventBufferFull=CreateEvent(NULL, FALSE, FALSE, NULL);
	hThread[0]=(HANDLE)_beginthreadex(NULL, 0, ProducerThreadFun, NULL, 0, NULL);
	hThread[1]= (HANDLE)_beginthreadex(NULL, 0, ConsumerThreadFun, NULL, 0, NULL);
	WaitForMultipleObjects(2, hThread, TRUE, INFINITE);
	
	CloseHandle(hThread[0]);
	CloseHandle(hThread[1]);
	CloseHandle(g_hEventBufferEmpty);
	CloseHandle(g_hEventBufferFull);
	
	DeleteCriticalSection(&g_cs);
	
	return 0;
}

进程同步与进程通信(#include <windows.h>)

任务二、进程通信

服务程序server端每次发送两个100之内的整数

客户程序client端实现将两个整数相加,并输出加法计算式

// Server端 

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

int main(int argc, char *argv[])
{
	int nRetCode = 0;
	char szBuffer[3] ;
	
	system("color F0");
	
    // 创建一个特定大小的文件映射对象,名称为"ShareMemory"
	HANDLE hMapping = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 4096, "ShareMemory" );   // 第一个参数也可以是NULL
	
    // 将这个文件映射对象的文件视图映射到进程的地址空间
	LPVOID lpBase =MapViewOfFile( hMapping,FILE_MAP_WRITE|FILE_MAP_READ,0,0,0);
	
	srand((unsigned)time(NULL));
	
	while(1)
	{	
		szBuffer[0]=rand()%100;
		szBuffer[1]=rand()%100;
		szBuffer[2]='\0';
		printf("%d\t%d\n",szBuffer[0],szBuffer[1]);
		
		// 向视图中写入两个100之内的整数
        strcpy( (char* )lpBase, szBuffer);
        
		Sleep(1000) ;
	}
	
	Sleep(20000);
	UnmapViewOfFile(lpBase);
	CloseHandle(hMapping);
	
	return nRetCode;
}
// Client端 

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

int main(int argc, char *argv[])
{
	int nRetCode = 0;
	
	system("color EA");
	
	// 打开这个名称为"ShareMemory"的文件映射对象	
	HANDLE hMapping = OpenFileMapping(FILE_MAP_ALL_ACCESS, NULL , "ShareMemory" );

	if (hMapping)
	{
		wprintf(L"%s \r\n",L"Success");
		
        // 把相同的文件映射视图映射到自己的地址空间中
		LPVOID lpBase =MapViewOfFile( hMapping,FILE_MAP_READ| FILE_MAP_WRITE,0,0,0);
		
		char szBuffer[20] = {0};
		while(1)
		{
 			// 从视图中读取服务进程所写入的数据
			strcpy (szBuffer, (char* )lpBase);
			printf("%d+%d=%d \n", szBuffer[ 0] , szBuffer[1], szBuffer[0]+szBuffer[1]);
			Sleep( 1000);
		}
		
		UnmapViewOfFile( lpBase);
		CloseHandle(hMapping);
	}
	
	else wprintf(L"%s",L"OpenMapping Error" );
	
	return nRetCode;
}

进程同步与进程通信(#include <windows.h>)文章来源地址https://www.toymoban.com/news/detail-489382.html

到了这里,关于进程同步与进程通信(#include <windows.h>)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux服务器同步Windows目录同步-rsync

    最近需要,Linux的服务器同步Windows的一个目录。查了下,大概有三种方法:网盘同步;rsync同步;挂载目录。 网盘同步,可以选择搭建一个Nextcloud 。但是问题在于,我需要的是,客户端和服务端的同步,而不是客户端和客户端的同步。服务端没有界面,安装客户端的网盘软件

    2024年02月11日
    浏览(62)
  • 操作系统实验 进程的管道通信

    目录 一、实验目的 二、实验预备知识 三、实验内容 四、实验结果分析 一、实验目的 (1)了解Linux系统中进程通信的基本原理。 (2)了解和掌握管道通信机制。 二、实验预备知识 (1)管道的概念 :管道是一种先入先出的、单向的、大小固定的通信通道。 写进程在管道的

    2024年02月02日
    浏览(50)
  • 《嵌入式系统开发实践》实验三 进程通信

    一、 实验目的 掌握无名管道与有名管道的进程通信; 掌握消息队列的读写操作; 掌握共享内存的通信机制。 二、 实验任务与要求 管道读写程序的编写与应用; 消息队列的发送和接收程序的编写和应用; 共享内存的创建、连接和分离编程和应用。 三、 实验工具和环境

    2024年02月07日
    浏览(55)
  • Linux和windows进程同步与线程同步那些事儿(三): Linux线程同步详解示例

    Linux和windows进程同步与线程同步那些事儿(一) Linux和windows进程同步与线程同步那些事儿(二): windows线程同步详解示例 Linux和windows进程同步与线程同步那些事儿(三): Linux线程同步详解示例 Linux和windows进程同步与线程同步那些事儿(四):windows 下进程同步 Linux和wi

    2024年02月01日
    浏览(39)
  • C++ Windows进程间共享内存通信

    在项目工程中需要64位程序调用32位程序并加以通信。 实现了两个进程间的内存共享。 提示:以下是本篇文章正文内容,下面案例可供参考 1、进程间通信原理: 主要实现: • 系统使用内存映射文件,以便加载和执行. exe和DLL文件。这可以大大节省页文件空间和应用程序启动

    2024年02月03日
    浏览(48)
  • 【Linux】详解进程通信中信号量的本质&&同步和互斥的概念&&临界资源和临界区的概念

             访问资源在安全的前提下,具有一定的顺序性,就叫做同步 。在多道程序系统中,由于资源有限,进程或线程之间可能产生冲突。同步机制就是为了解决这些冲突,保证进程或线程之间能够按照既定的顺序访问共享资源。同步机制有助于避免竞态条件和死锁(

    2024年04月25日
    浏览(46)
  • Windows开机后,Docker失败:Commoncauses include access rights issues

    这种错误看似已经跟你说很清楚了,但是看国外docker社区也提到这个问题,一大堆回答解决了别人的问题,但未必解决你的。我写自己的方案,可能也未必适合你,如果要说Root Cause根源就是windows的虚拟化功能开启的问题。 An unexpected error was encountered while executing a WSL command,

    2024年01月21日
    浏览(36)
  • MobaXterm使sftp目录与cmd目录同步

    这里我们会选择内存占用较低的MobarXterm作为SSH客户端,其官网地址: https://mobaxterm.mobatek.net/ 安装完成后界面如图所示: 点击session按钮,进入会话管理: 在弹出的session管理页面中,按照下图填写信息并保存: 点击OK后会提示你是第一次连接,询问你是信任连接的服务: 选

    2024年02月07日
    浏览(37)
  • 操作系统:4、进程管理之进程同步

    上述过程,若并发执行就会出现缓冲区数据出错 “哲学家进餐问题中会发生极端情况,所有哲学家都饿死,也就是所有进程都陷入等待状态” “生产者消费者问题”以及“哲学家进程问题”的根源问题是:彼此相互之间没有通信。 若生产者通知消费者我已经完成一件产品生

    2023年04月26日
    浏览(51)
  • linux 查看某个进程所在目录

    1、通过 ps -ef | grep xxx 查看进程信息 2、通过 ll /proc/PID 命令查看进程所在目录位置 Linux在启动一个进程时,系统会在 /proc 下创建一个以PID命名的文件夹,在该文件夹下会有我们的进程的信息,其中包括一个名为exe的文件即记录了绝对路径,通过 ll 或 ls –l 命令即可查看. cw

    2024年02月16日
    浏览(72)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包