📄 boundedbuffer.cc
字号:
#include "BoundedBuffer.h"BoundedBuffer::BoundedBuffer(int maxsize){ MaxSize = maxsize; buffer = new char[MaxSize]; lock = new Lock("list lock"); notEmpty = new Condition("list empty cond"); notFull = new Condition("list full cond"); n = in = out = 0;}BoundedBuffer::~BoundedBuffer(){ delete lock; delete notEmpty; delete notFull;}int BoundedBuffer::Read(void *data,int size){ int lest,i,s,all = size,Rsize = 0; char *temp = new char[MaxSize]; lock->Acquire(); while(Rsize < all) { i = 0; while(n == 0) notEmpty->Wait(lock); lest = MaxSize - out; if(n > size) { if(lest >= size) memcpy(temp+Rsize,buffer+out,size); else { memcpy(temp+Rsize,buffer+out,lest); memcpy(temp+Rsize+lest,buffer,size - lest); } while(i<size) { buffer[out] = ' '; out = (out + 1)%MaxSize; i++; } n = n - size; Rsize = Rsize + size; } else { s = n; if(lest >= s) memcpy(temp+Rsize,buffer+out,s); else { memcpy(temp+Rsize,buffer+out,lest); memcpy(temp+Rsize+lest,buffer,s-lest); } while(i<s) { buffer[out] = ' ' ; out = (out + 1)%MaxSize; i++; } n = 0; Rsize = Rsize + s; size = size - Rsize; } } memcpy(data,temp,all); notFull->Signal(lock); lock->Release(); return 1;}int BoundedBuffer::Write(void *data,int size){ int lest,s,all = size,Wsize = 0; char *temp = new char[MaxSize]; memcpy(temp,data,size); lock->Acquire(); while(Wsize < all) { while(n >= MaxSize) notFull->Wait(lock); lest = MaxSize - in; if(MaxSize-n > size) { if(lest >= size) memcpy(buffer+in,temp+Wsize,size); else { memcpy(buffer+in,temp+Wsize,lest); memcpy(buffer,temp+Wsize+lest,size-lest); } Wsize = Wsize + size; n = n + size; in = (in + size)%MaxSize; } else { s = MaxSize - n; if(lest >= s) memcpy(buffer+in,temp+Wsize,s); else { memcpy(buffer+in,temp+Wsize,lest); memcpy(buffer,temp+Wsize+lest,s-lest); } n = MaxSize; size = size - s; Wsize = Wsize + s; in = (in + s)%MaxSize; } } notEmpty->Signal(lock); lock->Release(); return 1;}void BoundedBuffer::printbuffer(){ printf("buffer = %s\n",buffer);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -