东北大学操作系统实验:进程同步和通信(生产者消费者问题模拟)
2018-02-06 13:48
567 查看
//producer_consumer.cc #include<iostream> #include<vector> #include<queue> using namespace std; const int bufferSize = 8; vector<int> buffer(bufferSize); queue<int> waitQueue; int id; int writeptr, readptr; int consumer, producer; void init() { for (int i = 0; i < bufferSize; ++i) { buffer[i] = 0; } while(!waitQueue.empty()) { waitQueue.pop(); } id = 0; writeptr = readptr = 0; consumer = producer = 0;//the num of waiting } int findEmpty(vector<int>& v, int len) { for(int i = 0; i < len; ++i) { if(v[i] == 0) return i; } return -1; } int findDirty(vector<int>& v, int len) { for(int i = 0; i < len; ++i) { if(v[i] > 0) return i; } return -1; } void show() { for(int i = 0; i < bufferSize; ++i) { if(buffer[i] > 0) cout << " " << buffer[i] << " |"; else cout << " |"; } cout << "\nwriteptr = \t" << writeptr << "\treadptr = \t" << readptr << "\t"; if(producer) cout << "PRODUCER wait : " << producer << "\t"; else cout << "PRODUCER ready\t\t"; if(consumer) cout << "CONSUMER wait : " << consumer; else cout << "CONSUMER ready"; cout << "\n"; } void produce() { if(findEmpty(buffer, bufferSize) == -1) // buffer full { ++id; producer++; waitQueue.push(id); } else { if(waitQueue.empty()) { id++; buffer[writeptr] = id; } else { producer--; buffer[writeptr] = waitQueue.front(); waitQueue.pop(); } writeptr = (writeptr + 1) % bufferSize; } } void consume() { if(findDirty(buffer, bufferSize) == -1) // buffer empty { if(waitQueue.empty()) { consumer++; } else { buffer[writeptr] = waitQueue.front(); waitQueue.pop(); writeptr = (writeptr + 1) % bufferSize; } } else { buffer[readptr] = 0; readptr = (readptr + 1) % bufferSize; } } void work() { char c; cin >> c; while(c != 'q' && (c == 'p' || c == 'c')) // q = quit p = produce one c = consume one { if(c == 'p') { produce(); } else if(c == 'c') { consume(); } show(); cin >> c; } } int main(int argc, char const *argv[]) { init(); work(); return 0; }
相关文章推荐
- 操作系统:经典进程同步问题(1)生产者-消费者问题
- 【操作系统总结】经典的进程同步问题-生产者消费者问题
- 操作系统进程同步三大问题:生产者消费者,哲学家进餐,读者写者问题
- 用C#线程技术模拟“生产者-消费者”经典进程同步问题
- C++模拟“生产者消费者”进程同步问题
- 进程同步---生产者与消费者问题以及进程同步机制--信号量及P、V操作
- Operating System-进程/线程内部通信-信号量、PV操作的实现和应用(解决哲学家进餐和生产者消费者问题)
- 操作系统经典同步互斥问题——生产者消费者问题
- 进程同步---生产者与消费者问题以及进程同步机制--信号量及P、V操作
- 操作系统学习笔记-信号量及PV操作与进程互斥和消费者生产者问题
- 进程同步---生产者与消费者问题以及进程同步机制--信号量及P、V操作
- 进程同步-生产者消费者问题
- 进程同步---生产者与消费者问题以及进程同步机制--信号量及P、V操作
- 经典进程同步问题 生产者——消费者问题
- 经典进程的同步问题-生产者与消费者
- 进程同步-生产者和消费者(PV操作实现——java多线程模拟)
- 进程模拟生产者-消费者问题
- 用信号量做进程同步解决生产者和消费者遇到的奇怪问题
- 进程同步---生产者与消费者问题以及进程同步机制--信号量及P、V操作
- Linux下信号量实现进程同步、互斥(生产者消费者问题)