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

📄 synchlist.cc

📁 美国加州大学操作系统课程实验平台Nachos
💻 CC
字号:
// synchlist.cc//	Routines for synchronized access to a list.//// 	Implemented in "monitor"-style -- surround each procedure with a// 	lock acquire and release pair, using condition signal and wait for// 	synchronization.//// Copyright (c) 1992-1993 The Regents of the University of California.// All rights reserved.  See copyright.h for copyright notice and limitation // of liability and disclaimer of warranty provisions.#include "copyright.h"#include "synchlist.h"//----------------------------------------------------------------------// SynchList<T>::SynchList//	Allocate and initialize the data structures needed for a //	synchronized list, empty to start with.//	Elements can now be added to the list.//----------------------------------------------------------------------template <class T>SynchList<T>::SynchList(){    list = new List<T>;    lock = new Lock("list lock");     listEmpty = new Condition("list empty cond");}//----------------------------------------------------------------------// SynchList<T>::~SynchList//	De-allocate the data structures created for synchronizing a list. //----------------------------------------------------------------------template <class T>SynchList<T>::~SynchList(){     delete listEmpty;    delete lock;    delete list;}//----------------------------------------------------------------------// SynchList<T>::Append//      Append an "item" to the end of the list.  Wake up anyone//	waiting for an element to be appended.////	"item" is the thing to put on the list. //----------------------------------------------------------------------template <class T>voidSynchList<T>::Append(T item){    lock->Acquire();		// enforce mutual exclusive access to the list     list->Append(item);    listEmpty->Signal(lock);	// wake up a waiter, if any    lock->Release();}//----------------------------------------------------------------------// SynchList<T>::RemoveFront//      Remove an "item" from the beginning of the list.  Wait if//	the list is empty.// Returns://	The removed item. //----------------------------------------------------------------------template <class T>TSynchList<T>::RemoveFront(){    T item;    lock->Acquire();			// enforce mutual exclusion    while (list->IsEmpty())	listEmpty->Wait(lock);		// wait until list isn't empty    item = list->RemoveFront();    lock->Release();    return item;}//----------------------------------------------------------------------// SynchList<T>::Apply//      Apply function to every item on a list.////      "func" -- the function to apply//----------------------------------------------------------------------template <class T>voidSynchList<T>::Apply(void (*func)(T)){    lock->Acquire();			// enforce mutual exclusion    list->Apply(func);    lock->Release();}//----------------------------------------------------------------------// SynchList<T>::SelfTest, SelfTestHelper//	Test whether the SynchList implementation is working,//	by having two threads ping-pong a value between them//	using two synchronized lists.//----------------------------------------------------------------------template <class T>voidSynchList<T>::SelfTestHelper (void* data) {    SynchList<T>* _this = (SynchList<T>*)data;    for (int i = 0; i < 10; i++) {        _this->Append(_this->selfTestPing->RemoveFront());    }}template <class T>voidSynchList<T>::SelfTest(T val){    Thread *helper = new Thread("ping");        ASSERT(list->IsEmpty());    selfTestPing = new SynchList<T>;    helper->Fork(SynchList<T>::SelfTestHelper, this);    for (int i = 0; i < 10; i++) {        selfTestPing->Append(val);	ASSERT(val == this->RemoveFront());    }    delete selfTestPing;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -