《UNIX网络编程:卷2》P203-P204:图10-33、10-34

生产者和消费者之间使用多个缓冲区

------------------------------------------------------------------

/*

* mycat2.c

* P203 图10-33 全局变量和main函数

*/

#include

#include

#include

#include

#include

#include

#include

#include

#define BUFFSIZE2048

#defineNBUFF8

void *produce(void *arg);

void *consume(void *arg);

struct {

struct {

chardata[BUFFSIZE];

ssize_tn;

} buff[NBUFF];

sem_tmutex;

sem_tnempty;

sem_tnstored;

} shared;

intfd;

int main(int argc, char *argv[])

{

pthread_ttid_produce, tid_consume;

if (argc != 2) {

fprintf(stderr, "usage: mycat2 \n");

exit(1);

}

if ((fd = open(argv[1], O_RDONLY))

fprintf(stderr, "open error: %s\n", strerror(errno));

exit(1);

}

/*

* 初始化三个信号量

*/

if(sem_init(&shared.mutex, 0, 1) == -1) {

fprintf(stderr, "sem_init error: %s\n", strerror(errno));

exit(1);

}

if(sem_init(&shared.nempty, 0, NBUFF) == -1) {

fprintf(stderr, "sem_init error: %s\n", strerror(errno));

exit(1);

}

if(sem_init(&shared.nstored, 0, 1) == -1) {

fprintf(stderr, "sem_init error: %s\n", strerror(errno));

exit(1);

}

// set_concurrency(2);// 该函数在Linux上无效

/*

* 创建两个线程,一个作为生产者,一个作为消费者。

*/

if (pthread_create(&tid_produce, NULL, produce, NULL) == -1) {

fprintf(stderr, "pthread_create error: %s\n", strerror(errno));

exit(1);

}

if (pthread_create(&tid_consume, NULL, consume, NULL) == -1) {

fprintf(stderr, "pthread_create error: %s\n", strerror(errno));

exit(1);

}

/*

* 主线程等待这两个线程终止

*/

pthread_join(tid_produce, NULL);

pthread_join(tid_consume, NULL);

/*

* 删除三个信号量

*/

sem_destroy(&shared.mutex);

sem_destroy(&shared.nempty);

sem_destroy(&shared.nstored);

exit(0);

}

/*

* mycat2.c

* P204 图10-34 produce和consume函数

*/

void *produce(void *arg)

{

inti;

for (i = 0; ; ) {

sem_wait(&shared.nempty);// 生产者等待到缓冲区中有一个条目的空间

sem_wait(&shared.mutex);// 二值信号量保护临界区

/* 临界区 */

sem_post(&shared.mutex);

/*

* 生产者每获得一个空闲缓冲区就调用read

* 如果read返回0(文件结束),生产者就在给nstored信号量加1后返回

*/

shared.buff[i].n = read(fd, shared.buff[i].data, BUFFSIZE);

if (shared.buff[i].n == 0) {

sem_post(&shared.nstored);

return(NULL);

}

if (++i >= NBUFF)

i = 0;

sem_post(&shared.nstored);// 缓冲区已填充

}

}

void *consume(void *arg)

{

inti;

for (i = 0; ; ) {

sem_wait(&shared.nstored);// 消费者等待nstroed信号量

sem_wait(&shared.mutex);// 二值信号量保护临界区

/* 临界区 */

sem_post(&shared.mutex);

/*

* 消费者线程取出缓冲区中的数据并把它们的内容写到标准输出

* 碰到长度为0的一个缓冲区表示已到达文件尾。

*/

if (shared.buff[i].n == 0)

return(NULL);

write(STDOUT_FILENO, shared.buff[i].data, shared.buff[i].n);

if (++i >= NBUFF)

i = 0;

sem_post(&shared.nempty);// 缓冲区已读取

}

}

linux POSIX 信号集,读书笔记:第10章 Posix信号量 (6)相关推荐

  1. PMP读书笔记(第10章)

    大家好,我是烤鸭:     今天做一个PMP的读书笔记. 第十章 项目沟通管理 项目沟通管理 项目沟通管理的核心概念 项目沟通管理的趋势和新兴实践 裁剪考虑因素 在敏捷或适应型环境中需要考虑的因素 1 ...

  2. AUTOMATE THE BORING STUFF WITH PYTHON读书笔记 - 第10章:ORGANIZING FILES

    SHUTIL 模块 shutil是shell utility的简称,使用此模块需要import shutil. 详见在线文档,在线帮助见help(shutil) >>> shutil ...

  3. 《Linux内核》课本读书笔记 第三章

    转载于:https://www.cnblogs.com/bushifudongjing/p/5339017.html

  4. 《人人都是项目经理V2.0》读书笔记——第10章 规划成本——每个项目都有成本的基线

    1. 全生命周期成本 项目管理学特别强调全生命周期成本,要求我们站在整个产品生命周期的角度,核算项目可能产生的所有成本. 什么是直接成本和间接成本? 直接成本就是和项目直接相关的成本.通俗点就是做项目 ...

  5. 鸟哥的LINUX私房菜 基础学习篇 读书笔记 -- 第零章 计算机概论 (一)

    鸟哥的LINUX私房菜 基础学习篇 读书笔记 -- 第零章 计算机概论 (一) 第零章 计算机概论 0.1 电脑:辅助人脑的好工具 0.1.1 计算机硬件五大组成部分 0.1.2 一切设计的起点: C ...

  6. Linux设备驱动程式之读书笔记(二) [转]

    http://www.sudu.cn/info/html/edu/code/20070102/286543.html setlevel.c 非常实用 google 查找 #define _syscal ...

  7. 《增强现实:原理、算法与应用》读书笔记(10)视觉惯性SLAM

    <增强现实:原理.算法与应用>读书笔记(10)视觉惯性SLAM 单目视觉SLAM系统存在一定的局限性,它非常依赖相机的成像质量,在图像质量不佳的时候则难以正常工作.即使图像质量很好,缺乏尺 ...

  8. 《Linux内核设计与实现》 第八周读书笔记 第四章 进程调度

    20135307 张嘉琪 第八周读书笔记 第四章 进程调度 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子系统.只有 ...

  9. 《写给企业家的经济学》读书笔记 - Part 10

    申明!非经本人同意,任何人与单位不得转载! 书名:<写给企业家的经济学> 作者:梁小民 读书时间:2006年7月 内容归类:经济学 内容简介:这是一本专门写给现在和未来企业家的经济学普及读 ...

最新文章

  1. luogu2320 鬼谷子的钱袋
  2. 这家中国企业和星巴克对着干 年亏16亿却成为全球最快上市公司
  3. Angular2 管道
  4. mysql 只开放某个表_MySQL只恢复某个库或某张表
  5. linux上安装drupal时出现Your PHP installation is too old. Drupal requires at least PHP 5.5.9.
  6. Python数据库操作——连接MySQL
  7. 【读书笔记《Android游戏编程之从零开始》】19.游戏开发基础(游戏音乐与音效)
  8. 机器学习算法之SVM的多分类
  9. 电子签章(Electronic Signature)在C#中的实现方法
  10. 爬取微博评论,生成词云图!
  11. 【知识兔】Excel多级联动关联下拉菜单的制作,一看就会!
  12. 传授化学反应方程式的书写技巧
  13. 怎么缩小gif动图的体积?三步快速压缩gif体积
  14. 基于struts2的个人信息管理系统(一)
  15. Spring Boot2.0 - 玩转logback日志
  16. 网站建设视频教程,史上最精,最全。
  17. 带2nd的计算机软件,2nd在计算器中是什么意思
  18. 【Orangepi Zero2 全志H616】OLED屏应用/IIC协议
  19. 分享:光盘镜像编辑及刻录工具UltraISO
  20. 怎样用ocr软件识别图片中的文字

热门文章

  1. 25~50K|云视科技SLAM算法工程师/机器人算法软件工程师招聘(社招+实习)
  2. SpringBoot 多个src文件夹,入口类的位置
  3. RDKit:运用RDKit计算USRCAT
  4. 杀死某个已知名字的进程
  5. 【Math Time 】Mean, Median, Mode 之间的区别
  6. html float作用,CSS float相关详解
  7. cytoscape插件bingo使用
  8. 本科生连发数篇SCI,你的第一篇SCI发表了吗?
  9. QIIME 2教程. 27语义类型Semantic(2021.2)
  10. python包NiBabel对医学影像文件格式进行读写:python包NiBabel简介集示例