(C语言)多进程实现消费者生产者pv操作(Windows和Linux版本)

多进程实现消费者生产者问题

一,实验目的
1,了解生产者消费者的互斥与同步问题
2,掌握Windows和Linux的进程通信方法

二,实验要求
完成Windows版本和Linux版本。
一个大小为3的缓冲区,初始为空。
2个生产者
随机等待一段时间,往缓冲区添加数据,
若缓冲区已满,等待消费者取走数据后再添加
重复6次

3个消费者
随机等待一段时间,从缓冲区读取数据
若缓冲区为空,等待生产者添加数据后再读取
重复4次

显示每次添加和读取数据的时间及缓冲区的状态

三,实验环境
Windows版本:Windows 10 64位系统,Dev-cpp编译器
Linux版本:Fedora29版本,gcc环境 vim文本编辑器

四,实验代码结构
1),pv操作伪代码:
array[3]:interger//缓冲区定义,大小为三
int empty=3,full=0;
int mutex=1;
i=0,j=0//缓冲区指针
x,y:item //产品变量
生产者: 消费者:
begin:
produce a product to x;
P(empty);
P(mutex);
array[i]=x;
ii=(i+1)%3;
V(full);
V(mutex);
,,,,,, ………,
End

消费者:

2)实验代码分析

Windows版本:

思路分析:Windows创建多进程使用creatprocess()函数调用自己,通过多次创建得到两个生产者进程三个消费者进程,在之中运行相应的生产者函数,消费者函数。在通过传入参数不同,来辨别是第一次主进程还是生产者进程,消费者进程。通过构建共享内存区进行进程间通信。

①多进程创建

② 构建共享内存区,再将文件映射到本进程,初始化

③在主创建进程间信号量full empty

分别在生产者消费者进程创建互斥访问量mutex

④同过argv量的不同判断进程归属

⑤运行结果:

全部代码见后

Linux版本:

思路分析:Linux使用fork进行多进程创建,分别在进程中运行消费者函数,生产者函数。建立共享主存区很信号量在进程建进行通信和缓存访问

②建立共享主存并进行映射

③创建进程间信号量full,empty和互斥量 mutex,并初始化

④实验结果:

五, 实验总结

本次实验获得圆满成功。

本次实验通过分别编写Windows和Linux版本的多进程实现消费者和生产者问题,了解生产者消费者的互斥与同步问题,掌握Windows和Linux的进程通信方法,也同时加强自己对多进程操作的理解。

代码:
Windows版本:

Linux版本:

GPG入门笔记

0. 简介
GPGGNU Privacy Guard的简写,是GNUPGP技术的实现。PGPPretty Good Privacy的简写,是一套用于加密的软件。
PGP加密过程如下(来自维基百科 PGP):

PGP同时利用了对称加密和非对称加密,对文件内容的加密用的是对称加密,对称加密的密钥是每次加密时生成的。由于对称密钥要随密文一起传输,采用了非对称加密算法给对称密钥进行了加密。
继续阅读 »

SSL 认证之后,request.getScheme()获取不到https的问题记录

通过浏览器输入https://www.xxx.com,request.getScheme()获取到的确实http而不是https
通过request.getRequestURL()拿到的也是http://www.xxx.com
分析原因,是因为用nginx+tomcat部署web服务,tomcat接受到的请求都是来自于nginx的http请求。

继续阅读 »

解决nginx部署https后,原tomcat部署的javaweb项目http不能正常加载js、css资源问题

公司做的小程序项目到部署的时候发现必须要用https协议,这个时候就在阿里云上申请了免费版本的SSL证书,这里证书的申请就不做介绍了,下面直接看怎么处理资源加载问题,从nginx和tomcat的配置文件入手。
1.nginx配置vhost.conf
继续阅读 »

vc++6.0 远程调试

VS2005 vs2008 vs2010 vs2012 远程调试上篇已经讲过,这里再讲下VC++6.0开发环境下的远程调试能力,仅需下面4步即可,更方便的就接着后面的5-6步。

因为目标程序需要在有采集卡等相关硬件支持下的工控机上工作,工控机上面一般没有调试环境也不会放置源代码(出于保密)。假如工控机上的目标程序运行中出了问题,就需要有调试环境却无法安装采集卡等硬件的笔记本上进行远程调试。 

一。远程调试条件

1.两者之间使用有线或无线连网。

2.目标机器与本机的调试机器连接通讯,需要四个文件:MSVCMON.EXE、DM.DLL、TLN0T.DLL和MSDIS110.DLL。它们可在VC6安装文件夹的Common/MSDEV98/Bin下面找到。
继续阅读 »

VS2005 vs2008 vs2010 vs2012 远程调试

一 远程端的设置

1. 远程机器端 的安全选项
在远程机器上,开始——设置——控制面板——管理工具——本地安全策略——本地策略——安全选项,在右侧找到网络访问:本地帐户的共享和安全模式,双击它,将“进来宾 – 本地用户以来宾身份验证”,改为:“经典 – 本地用户以自己的身份验证”  

2.远程端 运行VS 远程调试监视器
将本地文件夹下远程调试监视器所在文件夹(具体位置见后面 四。注意事项)下的所有文件,全部复制到远程计算机中,比如到 E:\remote\x86下。这里以vs2005为例,其余只是版本不同,操作都一样。
双击启动其中的msvsmon.exe,在其菜单,工具——选项 中,更改身份验证方式。
2.1  选择 无身份验证(仅限本机),并勾选“允许任何用户进行调试”。“服务器名”将显示 tu:4015, 其中的tu是远程计算机的名称,4015是端口号。
2.2  选择 Windows身份验证。“服务器名”,将显示 BT\lk@tu, 其中,BT 是局域网的域名,lk是登陆的用户名称,tu是远程计算机的名称。如无登录域,则显示为:lk@tu,其中,lk是登陆的用户名称,tu是远程计算机的名称。
继续阅读 »

Codeblocks更改编译器为VC++6.0

有时C/C++代码在Codeblocks上不能很好的运行,这是由于代码不标准造成的,Codeblocks编译器默认是GNU GCC,GCC遵循C++标准,而VC++是不太一样的。这篇文章介绍在Codeblocks下如何编译、调试VC 6.0的项目。(有错误的话请指正^_^)
条件
1、安装好Codeblocks16.01带MinGW
2、安装好VC++6.0(路径C:\Program Files (x86)\Microsoft Visual Studio)
步骤
1、打开Codeblocks,选择”Settings” – Compiler”,按图中步骤进行,C:\Program Files (x86)\Microsoft Visual Studio\VC98在VC++安装目录内

继续阅读 »

git配置代理命令

// 查看当前代理设置

// 设置当前代理为 http://127.0.0.1:1080 或 socket5://127.0.0.1:1080

// 删除 proxy git config –global –unset http.proxy

对大端小端的研究

简单的来说,通俗理解:
比如数据0x12345678
大端:地址由低到高,先放数据的高位,就是0x12,0x34,0x56,0x78;
小端:地址由低到高,先放数据的低位,就是0x78,0x56,0x34,0x12;
继续阅读 »

_beginthread和CreatThread的区别

我们知道在Windows下创建一个线程的方法有两种,一种就是调用Windows API CreateThread()来创建线程;另外一种就是调用MSVC CRT的函数_beginthread()或_beginthreadex()来创建线程。相应的退出线程也有两个函数Windows API的ExitThread()和CRT的_endthread()。这两套函数都是用来创建和退出线程的,它们有什么区别呢?

很多开发者不清楚这两者之间的关系,他们随意选一个函数来用,发现也没有什么大问题,于是就忙于解决更为紧迫的任务去了,而没有对它们进行深究。等到有一天忽然发现一个程序运行时间很长的时候会有细微的内存泄露,开发者绝对不会想到是因为这两套函数用混的结果。
继续阅读 »