IPC 经典问题:Reader & Writer Problem
完整代码实现:
#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的更多相关文章
- RFID 读写器 Reader Writer Cloner
RFID读写器的工作原理 RFID的数据采集以读写器为主导,RFID读写器是一种通过无线通信,实现对标签识别和内存数据的读出和写入操作的装置. 读写器又称为阅读器或读头(Reader).查询器(Int ...
- 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 ...
- Stream,Reader/Writer,Buffered的区别(1)
Stream: 是字节流形式,exe文件,图片,视频等.支持8位的字符,用于 ASCII 字符和二进制数据. Reader/Writer: 是字符流,文本文件,XML,txt等,用于16位字符,也就是 ...
- RubyMine生成reader/writer方法
RubyMine生成reader/writer方法 在非类的ruby文件中,Alt+Insert会出现新建文件的选项: 在ruby文件的类中,Alt+Insert会出现get/set方法生成提示和重构 ...
- IPC 经典问题:Sleeping Barber Problem
完整代码实现: #include <stdio.h> #include <unistd.h> #include <time.h> #include <stdl ...
- 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 ...
- Stream,Reader/Writer,Buffered的区别(2)
Reader: Reader的子类: 1.BufferedReader: FileReader 没有提供读取文本行的功能,BufferedReader能够指定缓冲区大小,包装了read方法高效读取字符 ...
- ExtJS4.2学习(7)——基础知识之Reader&Writer篇
Reader: 主要用于将proxy数据代理读取的数据按照不同的规则进行解析,将解析好的数据保存到Modle中. 结构图 Ext.data.reader.Reader 读取器的根类(很少直接实例化这个 ...
- 02_IO操作的基本规律(InputStream,OutputStream,Reader,Writer,FileReader,FileWriter,BufferedReader,BufferedWri
模拟BufferedInputStream,编写一个类 package toto.IO; import java.io.IOException; import java.io.InputStre ...
随机推荐
- Windows版 charles安装证书抓包网页HTTPS
1.在Charles官网https://www.charlesproxy.com/download/下载,我这边下载的是免费体验版的. 2.安装好以后打开,配置Charles证书:选择 help--S ...
- Pycharm github登录 Invalid authentication data. Connection refused.
在github.com前加上 https:// 注意登录时使用的是用户名不是邮箱
- 自顶向下redis4.0(2)文件事件与客户端
redis4.0的文件事件与客户端 目录 redis4.0的文件事件与客户端 简介 正文 准备阶段 接受客户端连接 处理数据 返回数据结果 参考文献 简介 文件事件的流程大概如下: 在服务器初始化时生 ...
- Hive中自定义序列化器(带编码)
hive SerDe的简介 https://www.jianshu.com/p/afee9acba686 问题 数据文件为文本文件,每一行为固定格式,每一列的长度都是定长或是有限制范围,考虑采用hiv ...
- css 12-CSS3属性详解:动画详解
12-CSS3属性详解:动画详解 #前言 本文主要内容: 过渡:transition 2D 转换 transform 3D 转换 transform 动画:animation #过渡:transiti ...
- Hibernate Tools插件在线安装
1.查看你的Eclipse的版本:Help | About Eclipse Version: Oxygen.2 Release(4.11.0) 2.HibernateTools的下载地址为:http: ...
- 带你探究Python的诞生和由来
最近,Python语言越来越火,那什么是Python?它怎么诞生的?它跟C语言.shell语言有什么区别?语言环境是怎么样的?下面,跟着我的步伐,一起去了解一下吧~ Python 诞生在一个圣诞节 P ...
- kafka rebalance解决方案 -incremental cooperative协议和static membership功能
apache kafka的重平衡(rebalance),一直以来都为人诟病.因为重平衡过程会触发stop-the-world(STW),此时对应topic的资源都会处于不可用的状态.小规模的集群还好, ...
- 【故障公告】redis内存耗尽造成博客后台无法保存
非常抱歉,今天上午11:00~11:30左右,由于 redis 服务器内存耗尽造成博客后台故障--保存博文时总是提示"请求太过频繁,请稍后再试",由此给您带来麻烦,请您谅解. 由于 ...
- MVC中Autofac的使用
参考博文 https://www.cnblogs.com/liupeng/p/4806184.html https://blog.csdn.net/qq_37214567/article/detail ...