linux生产者进程数为3个,linux 多线程面试题_linux 进程线程_linux 线程 进程(3)
//生产者线程函数
unsignedint__stdcallProducerThreadFun(PVOIDpM)
{
for(inti=1;i<=END_PRODUCE_NUMBER;i++)
{
//等待有空的缓冲区出现
WaitForSingleObject(g_hSemaphoreBufferEmpty,INFINITE);
//互斥的访问缓冲区
EnterCriticalSection(&g_cs);
g_Buffer[g_i]=i;
问题描述如下:一个生产者生产出某种 类型的数据(记录、字符),并把它送入缓 冲区(缓冲区为n) ,惟一的一个消费者一 次从缓冲区中取走一个数据,系统要保 证缓冲区操作不发生重叠,即在任一时 刻只能有一方(生产者或消费者)访问缓冲 区。我们看@1行,我们通过make语法建立了一个缓冲为6的int管道,生产者只需要关心生产,把生产好的数据直接扔进管道,消费者呢,不用关心生产者的任何细节,只需要从管道里取数据,生产端和消费端都是阻塞的,当管道为空时,消费端阻塞,当管道满时,生产端阻塞。ti被硬件置1的情况是,当串行发送缓冲寄存器内的数据被通过txd( p3.1 )发送完毕时( 不同的串口方式置1条件不同 )不是指将数据存入串行发送缓冲器中时ti会被置1,同理ri被置1的情况是当rxd( p3.0 )接收到数据将此数据按位存入串行接收缓冲寄存器内完毕时( 不同串口方式置1的条件不同 )不是指从串行接收缓冲寄存器读完数据时ri会被置1。
g_i=(g_i+1)%BUFFER_SIZE;
LeaveCriticalSection(&g_cs);
//通知消费者有新数据了
ReleaseSemaphore(g_hSemaphoreBufferFull,1,NULL);
}
printf(“生产者完成任务,线程结束运行\n”);
return0;
}
//消费者线程函数
unsignedint__stdcallConsumerThreadFun(PVOIDpM)
{
while(true)
{
//等待非空的缓冲区出现
WaitForSingleObject(g_hSemaphoreBufferFull,INFINITE);
//互斥的访问缓冲区
EnterCriticalSection(&g_cs);
SetConsoleColor(FOREGROUND_GREEN);
问题描述如下:一个生产者生产出某种 类型的数据(记录、字符),并把它送入缓 冲区(缓冲区为n) ,惟一的一个消费者一 次从缓冲区中取走一个数据,系统要保 证缓冲区操作不发生重叠,即在任一时 刻只能有一方(生产者或消费者)访问缓冲 区。第六行的含义为:rtsg 向 csam发送了19字节的数据(字节的编号为2到20,传送方向为rtsg到csam). 包中设置了push标志. 在第7行, csam 喊到, 她已经从rtsg中收到了21以下的字节, 但不包括21编号的字节. 这些字节存放在csam的socket的接收缓冲中, 相应地, csam的接收缓冲窗口大小会减少19字节(nt:可以从第5行和第7行win属性值的变化看出来). csam在第7行这个包中也向rtsg发送了一个 字节. 在第8行和第9行, csam 继续向rtsg 分别发送了两个只包含一个字节的数据包, 并且这个数据包带push标志.。我们看@1行,我们通过make语法建立了一个缓冲为6的int管道,生产者只需要关心生产,把生产好的数据直接扔进管道,消费者呢,不用关心生产者的任何细节,只需要从管道里取数据,生产端和消费端都是阻塞的,当管道为空时,消费端阻塞,当管道满时,生产端阻塞。
#define f_lblue foreground_blue //前景蓝。#define f_lbluegreen foreground_blue|foreground_green //前景蓝绿。#define f_lpurple foreground_red|foreground_blue //前景紫。
if(g_Buffer[g_j]==END_PRODUCE_NUMBER)//结束标志
{
LeaveCriticalSection(&g_cs);
//通知其它消费者有新数据了(结束标志)
ReleaseSemaphore(g_hSemaphoreBufferFull,1,NULL);
break;
}
g_j=(g_j+1)%BUFFER_SIZE;
LeaveCriticalSection(&g_cs);
Sleep(50);//someotherworktodo
ReleaseSemaphore(g_hSemaphoreBufferEmpty,1,NULL);
}
SetConsoleColor(FOREGROUND_GREEN);
printf(“编号为%d的消费者收到通知,线程结束运行\n”,GetCurrentThreadId());
SetConsoleColor(FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
return0;
}
intmain()
{
InitializeCriticalSection(&g_cs);
//初始化信号量,一个记录有产品的缓冲区个数,另一个记录空缓冲区个数.
g_hSemaphoreBufferEmpty=CreateSemaphore(NULL,4,4,NULL);
g_hSemaphoreBufferFull=CreateSemaphore(NULL,0,4,NULL);
g_i=0;
g_j=0;
memset(g_Buffer,0,sizeof(g_Buffer));
constintTHREADNUM=3;
HANDLEhThread[THREADNUM];
//生产者线程
hThread[0]=(HANDLE)_beginthreadex(NULL,0,ProducerThreadFun,NULL,0,NULL);
//消费者线程
hThread[1]=(HANDLE)_beginthreadex(NULL,0,ConsumerThreadFun,NULL,0,NULL);
hThread[2]=(HANDLE)_beginthreadex(NULL,0,ConsumerThreadFun,NULL,0,NULL);
WaitForMultipleObjects(THREADNUM,hThread,TRUE,INFINITE);
for(inti=0;i
CloseHandle(hThread[i]);
//销毁信号量和关键段
CloseHandle(g_hSemaphoreBufferEmpty);
CloseHandle(g_hSemaphoreBufferFull);
DeleteCriticalSection(&g_cs);
return0;
}
//1生产者2消费者4缓冲区
#include“stdafx.h”
#include“stdio.h”
#include“stdlib.h”
#include
#include
#include
#include
#include
usingnamespacestd;
//设置控制台输出颜色
BOOLSetConsoleColor(WORDwAttributes)
{
HANDLEhConsole=GetStdHandle(STD_OUTPUT_HANDLE);
if(hConsole==INVALID_HANDLE_VALUE)
returnFALSE;
returnSetConsoleTextAttribute(hConsole,wAttributes);
}
constintEND_PRODUCE_NUMBER=8;//生产产品个数
constintBUFFER_SIZE=4;//缓冲区个数
intg_Buffer[BUFFER_SIZE];//缓冲池
intg_i,g_j;
CRITICAL_SECTIONg_cs;//信号量与关键段
HANDLEg_hSemaphoreBufferEmpty,g_hSemaphoreBufferFull;
//生产者线程函数
unsignedint__stdcallProducerThreadFun(PVOIDpM)
{
for(inti=1;i<=END_PRODUCE_NUMBER;i++)
{
//等待有空的缓冲区出现
WaitForSingleObject(g_hSemaphoreBufferEmpty,INFINITE);
//互斥的访问缓冲区
EnterCriticalSection(&g_cs);
g_Buffer[g_i]=i;
printf(“生产者在缓冲池第%d个缓冲区中投放数据%d\n”,g_i,g_Buffer[g_i]);
g_i=(g_i+1)%BUFFER_SIZE;
LeaveCriticalSection(&g_cs);
//通知消费者有新数据了
ReleaseSemaphore(g_hSemaphoreBufferFull,1,NULL);
}
printf(“生产者完成任务,线程结束运行\n”);
return0;
}
//消费者线程函数
unsignedint__stdcallConsumerThreadFun(PVOIDpM)
{
while(true)
{
//等待非空的缓冲区出现
waitforsingleobject(hcounterin,infinite)。 waitforsingleobject(hmutex,infinite)。 waitforsingleobject(hmutex,infinite)。
//互斥的访问缓冲区
EnterCriticalSection(&g_cs);
SetConsoleColor(FOREGROUND_GREEN);
问题描述如下:一个生产者生产出某种 类型的数据(记录、字符),并把它送入缓 冲区(缓冲区为n) ,惟一的一个消费者一 次从缓冲区中取走一个数据,系统要保 证缓冲区操作不发生重叠,即在任一时 刻只能有一方(生产者或消费者)访问缓冲 区。第六行的含义为:rtsg 向 csam发送了19字节的数据(字节的编号为2到20,传送方向为rtsg到csam). 包中设置了push标志. 在第7行, csam 喊到, 她已经从rtsg中收到了21以下的字节, 但不包括21编号的字节. 这些字节存放在csam的socket的接收缓冲中, 相应地, csam的接收缓冲窗口大小会减少19字节(nt:可以从第5行和第7行win属性值的变化看出来). csam在第7行这个包中也向rtsg发送了一个 字节. 在第8行和第9行, csam 继续向rtsg 分别发送了两个只包含一个字节的数据包, 并且这个数据包带push标志.。我们看@1行,我们通过make语法建立了一个缓冲为6的int管道,生产者只需要关心生产,把生产好的数据直接扔进管道,消费者呢,不用关心生产者的任何细节,只需要从管道里取数据,生产端和消费端都是阻塞的,当管道为空时,消费端阻塞,当管道满时,生产端阻塞。
SetConsoleColor(FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
if(g_Buffer[g_j]==END_PRODUCE_NUMBER)//结束标志
{
LeaveCriticalSection(&g_cs);
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-114181-3.html
linux生产者进程数为3个,linux 多线程面试题_linux 进程线程_linux 线程 进程(3)相关推荐
- linux修改文件句柄数生效_修改Linux的open files参数是,立即生效,无需重启
通过命令ulimit -a查看的open files参数的修改: core file size (blocks, -c) 0 data seg size (kby ...
- linux进程数和句柄数
注:linux版本CentOS7 目录 一.进程和句柄概念 二.Linux资源限制 1. 用户资源限制 2.service 资源限制 3. 系统资源限制 三. 进程数限制 1. 用户进程数限制 2. ...
- linux修改文件句柄数生效_linux修改句柄数
linux服务器大并发调优时,往往需要预先调优linux参数,其中修改linux最大文件句柄数是最常修改的参数之一. 在linux中执行ulimit -a 即可查询linux相关的参数,如下所示: [ ...
- Linux配置汇总上(北大青鸟Linux课程学习总结)
一.基本网络配置 1.基本配置文件 /etc/hosts:是将IP地址和主机名联系起来的简单文本文件. 格式:IP地址 全限定主机名 别名 举例:192.168.0.2 wanghui.shuke.c ...
- 知识点查缺补漏贴03:单机最大进程数,线程数和Socket连接数
前言: 参加Unix/Linux相关高级研发职位时,是否经常会被文档,单机允许最大进程数.线程数和Socket连接数,而你却感到束手无措呢?本文给你一个最为详细的答案. 一.最大进程数 运行Linux ...
- systemd 对你的进程数限制横插一脚啦
原文:https://blog.apporc.org/2016/05/systemd-%E5%AF%B9%E4%BD%A0%E7%9A%84%E8%BF%9B%E7%A8%8B%E6%95%B0%E9 ...
- IIS 6.0的web园 最大工作进程数
这篇文章主要介绍了IIS 6.0的web园 最大工作进程数,需要的朋友可以参考下 IIS 6.0允许将应用程序池配置成一个Web园(Web Garden).要理解Web园的概念,可以设想这样一种情形: ...
- IIS6.0的web园--最大工作进程数
IIS 6.0允许将应用程序池配置成一个Web园(Web Garden).要理解Web园的概念,可以设想这样一种情形:假设有一个IIS 5.0服务器和三个Web网站,每一个Web网站运行着相同的应用程 ...
- linux 可运行的最大 线程 进程 数
cat /proc/sys/kernel/threads-max 查系统支持的最大线程数,一般会很大,相当于理论值 该命令在不同的机器上 值不一样. 在centos 服务器上面 : 513845 在u ...
最新文章
- 是时候改变自学编程方法了,这篇国外网友的分享被fast.ai创始人等点赞
- 编制一个c语言成绩记录簿_C语言学到什么程度能写推箱子
- Android实用笔记——使用Spinner实现下拉列表
- java遇见的问题分析
- usb serial port 驱动_tty初探 — uart驱动框架分析
- 【转】D365 FO第三方集成(三)---服务实现
- mysql重新构建自增长_mysql 建表后 重新构建 自增字段 (保留 原有字段结构)
- 总结MyBatis+Spring的整合
- 开机启动简易收集面板并最小化
- 7-4 sdut-运输计费问题 (10 分)python
- 追加docker已运行容器添加或修改端口映射方法
- Ubuntu 20编译安装GCC 7.3.0
- “微积分7天搞定”学习记录
- 潘多拉网吧防火墙 1.0 双线破解
- 计算机的进制的转换公式,计算机进制转换公式
- SuperMemo导出html,使用思维导图和SuperMemo一起来快速复习(1)
- 性价比高的蓝牙耳机排行榜,推荐200内最好用蓝牙耳机品牌
- 码绘VS手绘(二)动态绘图
- 好用并强大的图片插件:PhotoSwipe.js
- 基于ngx-rtmp-module模块http-flv直播流的实现