boundedbuffer.cc

来自「nachos下线程与同步的实验」· CC 代码 · 共 76 行

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