//生产者线程函数

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)相关推荐

  1. linux修改文件句柄数生效_修改Linux的open files参数是,立即生效,无需重启

    通过命令ulimit -a查看的open files参数的修改: core file size          (blocks, -c) 0 data seg size           (kby ...

  2. linux进程数和句柄数

    注:linux版本CentOS7 目录 一.进程和句柄概念 二.Linux资源限制 1. 用户资源限制 2.service 资源限制 3. 系统资源限制 三. 进程数限制 1. 用户进程数限制 2. ...

  3. linux修改文件句柄数生效_linux修改句柄数

    linux服务器大并发调优时,往往需要预先调优linux参数,其中修改linux最大文件句柄数是最常修改的参数之一. 在linux中执行ulimit -a 即可查询linux相关的参数,如下所示: [ ...

  4. Linux配置汇总上(北大青鸟Linux课程学习总结)

    一.基本网络配置 1.基本配置文件 /etc/hosts:是将IP地址和主机名联系起来的简单文本文件. 格式:IP地址 全限定主机名 别名 举例:192.168.0.2 wanghui.shuke.c ...

  5. 知识点查缺补漏贴03:单机最大进程数,线程数和Socket连接数

    前言: 参加Unix/Linux相关高级研发职位时,是否经常会被文档,单机允许最大进程数.线程数和Socket连接数,而你却感到束手无措呢?本文给你一个最为详细的答案. 一.最大进程数 运行Linux ...

  6. 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 ...

  7. IIS 6.0的web园 最大工作进程数

    这篇文章主要介绍了IIS 6.0的web园 最大工作进程数,需要的朋友可以参考下 IIS 6.0允许将应用程序池配置成一个Web园(Web Garden).要理解Web园的概念,可以设想这样一种情形: ...

  8. IIS6.0的web园--最大工作进程数

    IIS 6.0允许将应用程序池配置成一个Web园(Web Garden).要理解Web园的概念,可以设想这样一种情形:假设有一个IIS 5.0服务器和三个Web网站,每一个Web网站运行着相同的应用程 ...

  9. linux 可运行的最大 线程 进程 数

    cat /proc/sys/kernel/threads-max 查系统支持的最大线程数,一般会很大,相当于理论值 该命令在不同的机器上 值不一样. 在centos 服务器上面 : 513845 在u ...

最新文章

  1. 是时候改变自学编程方法了,这篇国外网友的分享被fast.ai创始人等点赞
  2. 编制一个c语言成绩记录簿_C语言学到什么程度能写推箱子
  3. Android实用笔记——使用Spinner实现下拉列表
  4. java遇见的问题分析
  5. usb serial port 驱动_tty初探 — uart驱动框架分析
  6. 【转】D365 FO第三方集成(三)---服务实现
  7. mysql重新构建自增长_mysql 建表后 重新构建 自增字段 (保留 原有字段结构)
  8. 总结MyBatis+Spring的整合
  9. 开机启动简易收集面板并最小化
  10. 7-4 sdut-运输计费问题 (10 分)python
  11. 追加docker已运行容器添加或修改端口映射方法
  12. Ubuntu 20编译安装GCC 7.3.0
  13. “微积分7天搞定”学习记录
  14. 潘多拉网吧防火墙 1.0 双线破解
  15. 计算机的进制的转换公式,计算机进制转换公式
  16. SuperMemo导出html,使用思维导图和SuperMemo一起来快速复习(1)
  17. 性价比高的蓝牙耳机排行榜,推荐200内最好用蓝牙耳机品牌
  18. 码绘VS手绘(二)动态绘图
  19. 好用并强大的图片插件:PhotoSwipe.js
  20. 基于ngx-rtmp-module模块http-flv直播流的实现

热门文章

  1. 控制连接数量和密码保护-flashcom教程 密码保护
  2. 10.7 csp-s模拟测试63 Median+Game+Park
  3. v-cloak 的用法
  4. IIS Tomcat共享80端口
  5. java中各种集合的用法和比较
  6. saltstack实战2--远程执行之模块(Modules)
  7. C++课堂作业_02_PAT1025.反转链表
  8. 机器学习定义及常用算法
  9. 動態設定GridView的列寬
  10. idea解决lombok注解失效问题