完整代码实现:

#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define TOTAL_NUMBER 20
void *writer(void *param);
void *reader(void *param); int reader_num = 0;
int writer_num = 0;
int reader_mutex = 0;
int unit[TOTAL_NUMBER] = {0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0}; sem_t wmutex;
sem_t mutex; int main(int argc, char *argv[]) {
sem_init(&mutex,0,1);
sem_init(&wmutex,0,1); for (int i = 0; i < TOTAL_NUMBER; i++){
sleep(1);
time_t t = time(NULL);
struct tm tm = *localtime(&t);
if(unit[i] == 0){
pthread_t thread_id;
pthread_create(&thread_id, NULL, reader, NULL);
reader_num ++;
printf("%d:%d:%d: Creating %dth reader.\n", tm.tm_hour, tm.tm_min, tm.tm_sec, reader_num);
}else{
pthread_t thread_id;
pthread_create(&thread_id, NULL, writer, NULL);
writer_num ++;
printf("%d:%d:%d: Creating %dth writer.\n", tm.tm_hour, tm.tm_min, tm.tm_sec, writer_num);
}
}
} void *reader(void *param) {
time_t t = time(NULL);
struct tm tm = *localtime(&t);
printf("%d:%d:%d: NO.%u reader requires reading.\n", tm.tm_hour, tm.tm_min, tm.tm_sec, pthread_self()); sem_wait(&mutex);
reader_mutex ++;
if(reader_mutex == 1){
sem_wait(&wmutex);
}
sem_post(&mutex);
// Read data
t = time(NULL);
tm = *localtime(&t);
printf("%d:%d:%d: NO.%u reader begins to read.\n", tm.tm_hour, tm.tm_min, tm.tm_sec, pthread_self());
sleep(1);
t = time(NULL);
tm = *localtime(&t);
printf("%d:%d:%d: End of NO.%u reader for reading.\n", tm.tm_hour, tm.tm_min, tm.tm_sec, pthread_self());
sem_wait(&mutex);
reader_mutex --;
if(reader_mutex == 0){
sem_post(&wmutex);
}
sem_post(&mutex);
} void *writer(void *param) {
time_t t = time(NULL);
struct tm tm = *localtime(&t);
printf("%d:%d:%d: NO.%u writer requires writing.\n", tm.tm_hour, tm.tm_min, tm.tm_sec, pthread_self()); sem_wait(&wmutex);
// Write data
t = time(NULL);
tm = *localtime(&t);
printf("%d:%d:%d: NO.%u writer begins to write.\n", tm.tm_hour, tm.tm_min, tm.tm_sec, pthread_self());
sleep(6);
t = time(NULL);
tm = *localtime(&t);
printf("%d:%d:%d: End of NO.%u writer for writing.\n", tm.tm_hour, tm.tm_min, tm.tm_sec, pthread_self());
sem_post(&wmutex);
}

IPC 经典问题:Reader & Writer Problem的更多相关文章

  1. RFID 读写器 Reader Writer Cloner

    RFID读写器的工作原理 RFID的数据采集以读写器为主导,RFID读写器是一种通过无线通信,实现对标签识别和内存数据的读出和写入操作的装置. 读写器又称为阅读器或读头(Reader).查询器(Int ...

  2. RFIDler - An open source Software Defined RFID Reader/Writer/Emulator

    https://www.kickstarter.com/projects/1708444109/rfidler-a-software-defined-rfid-reader-writer-emul h ...

  3. Stream,Reader/Writer,Buffered的区别(1)

    Stream: 是字节流形式,exe文件,图片,视频等.支持8位的字符,用于 ASCII 字符和二进制数据. Reader/Writer: 是字符流,文本文件,XML,txt等,用于16位字符,也就是 ...

  4. RubyMine生成reader/writer方法

    RubyMine生成reader/writer方法 在非类的ruby文件中,Alt+Insert会出现新建文件的选项: 在ruby文件的类中,Alt+Insert会出现get/set方法生成提示和重构 ...

  5. IPC 经典问题:Sleeping Barber Problem

    完整代码实现: #include <stdio.h> #include <unistd.h> #include <time.h> #include <stdl ...

  6. multithreading - Reader/Writer Locks in C++

    You Only Need To Note This: only 1 single thread can acquire an upgrade_lock at one time. others are ...

  7. Stream,Reader/Writer,Buffered的区别(2)

    Reader: Reader的子类: 1.BufferedReader: FileReader 没有提供读取文本行的功能,BufferedReader能够指定缓冲区大小,包装了read方法高效读取字符 ...

  8. ExtJS4.2学习(7)——基础知识之Reader&Writer篇

    Reader: 主要用于将proxy数据代理读取的数据按照不同的规则进行解析,将解析好的数据保存到Modle中. 结构图 Ext.data.reader.Reader 读取器的根类(很少直接实例化这个 ...

  9. 02_IO操作的基本规律(InputStream,OutputStream,Reader,Writer,FileReader,FileWriter,BufferedReader,BufferedWri

     模拟BufferedInputStream,编写一个类 package toto.IO; import java.io.IOException; import java.io.InputStre ...

随机推荐

  1. 架构师基础技能-搭建gitLab

    前言 想要成为一名架构师,一定要有从无到有搭建环境的能力,这是作为架构师的基础技能,而gitLab服务器的搭建一定又是重中之重. 相信很多小伙伴的公司也在使用gitLab,但都是你们公司的架构师搭建好 ...

  2. 来体验下Linux吧

    在前面的几期中我们从树莓派开始了解Linux,大家可能已经想来试一下手了.趁热打铁,本期我将介绍两种方便体验学习Linux的方法,在线体验或者安装虚拟机. 1 在线体验Linux 如果想快速的体验下L ...

  3. Peomise

    什么是promise 简单回答: 一种异步的解决方案 回顾一下什么是异步 ​ 事件 / setTimeout 异步执行的时机 ​ 同步->异步微任务->GUI渲染->异步宏任务 #为 ...

  4. Spring笔记(9) - IOC实现方式详解

    IOC概念 控制反转(Inversion of Control,IOC),是面向对象编程中的一种设计原则,它建议将不需要的职责移出类,让类专注于核心职责,从而提供松散耦合,提高优化软件程序设计.它把传 ...

  5. js中点回车enter触发事件&layui弹窗按enter键不停弹窗问题的解决&js实现鼠标焦点自动落到文本框(layui)

     js中回车触发事件 一. document.onkeydown = function (e) { // 回车提交表单 // 兼容FF和IE和Opera var theEvent = window.e ...

  6. 国产的开源数据库——GitHub 热点速览 Vol.52

    作者:HelloGitHub-小鱼干 本以为本周的 GitHub 和十二月一样平平无奇就那么度过了,结果 BackgroundMattingV2 重新刷新了本人的认知,还能这种骚操作在线实时抠视频去背 ...

  7. 将后端返回的数据在jsp中拼接成table列表

    //先下载jquery js文件 放入项目中 jsp文件内容 <%@ page language="java" pageEncoding="UTF-8"% ...

  8. easyui中开始时间小于结束时间 不然无法点击

    <tr> <td align="right">用药开始时间:</td> <td><input id="time_fr ...

  9. 快速沃尔什变换 (FWT)学习笔记

    证明均来自xht37 的洛谷博客 作用 在 \(OI\) 中,\(FWT\) 是用于解决对下标进行位运算卷积问题的方法. \(c_{i}=\sum_{i=j \oplus k} a_{j} b_{k} ...

  10. Oracel 修改字段类型(有数据的情况)

    1 /*修改原字段名bh为bh_tmp*/ 2 alter table Tab_Name rename column bh to bh_tmp; 3 /*增加一个和原字段名同名的字段bh*/ 4 al ...