boundedbuffer.cc

来自「linux的例子,就是下载后到自己的机子上去运行」· CC 代码 · 共 125 行

CC
125
字号
#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 + =
减小字号Ctrl + -
显示快捷键?