⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 boundedbuffer.cc

📁 nachos下线程与同步的实验
💻 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 + -