📄 boundedbuffer.cc
字号:
#include "BoundedBuffer.h"
BoundedBuffer::BoundedBuffer(int maxsize)
// create a bounded buffer with a limit of 'maxsize' bytes
{
lock = new Lokc("BufferLock");
BufferEmpty = new Condition("BufferEmpty");
BufferFull = new Condition("BufferFull");
Buffer = new char[maxsize];
BufferSize = maxsize;
number = 0;
element = new int[maxsize];
for ( int i=0; i<=maxsize; i++ )
element[i] = 0;
}
BoundedBuffer::~BoundedBuffer() //析构函数
{
delete Buffer;
delete lock;
delete BufferEmpty;
delete BufferFull;
delete element;
}
void BoundedBuffer::Read(void *data, int size)
// read 'size' bytes from the bounded buffer, storing into 'data'.
// ('size' may be greater than 'maxsize')
{
lock->Acquire();
for ( int i=0,j=0; i<BufferSize && j<size; i++,j++ )
{
if ( number == 0 )
{
BufferEmpty->Wait(lock);
i = 0;
}
else if ( element[i] == 1 )
{
data[i] = Buffer[j];
element[i] = 0;
j++;
number--;
if ( number == BufferSize-1 )
BufferFull->Signal(lock);
}
}
lock->Release();
}
void BoundedBuffer::Write(char *data, int size)
// write 'size' bytes from 'data' into the bounded buffer.
// ('size' may be greater than 'maxsize')
{
lock->Acquire();
for ( int i=0,j=0; i<BufferSize && j<size; i++,j++ )
{
if ( number == BufferSize )
{
BufferFull->Wait(lock);
i = 0;
}
else if ( element[i] == 0 )
{
Buffer[i] = data[j];
element[i] = 1;
j++;
number++;
if ( number == 1 )
BufferEmpty->Signal(lock);
}
}
lock->Release();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -