logo资料库

实验一体验Nachos下的并发程序设计.doc

第1页 / 共14页
第2页 / 共14页
第3页 / 共14页
第4页 / 共14页
第5页 / 共14页
第6页 / 共14页
第7页 / 共14页
第8页 / 共14页
资料共14页,剩余部分请下载后查看
实验一体验 Nachos 下的并发程序设计 实验人员:黄侨星 4 班 学号:23020062203895 完成时间:2009.3.31 一、 实验目的: 本次实验的目的在于对 nachos 进行熟悉,并初步体验 nachos 下的并发程序设计。 二、 实验内容: 安装 nachos; 用 C++实现双向有序链表; 在 nachos 系统中使用你所写的链表程序并演示一些并发错误 三、 实验步骤: 首先要用 C++实现一个有序双向链表,将链表文件 dllist.h、dllist.cc、dllist-driver.cc 拷贝到 ~/nachos/nachos-3.4/code/threads/中。 其中各个文件代码为: Dllist.h class DLLElement { public: DLLElement(int node_Key ); //初始化链表 DLLElement *next; //下一个元素,如果指向最后,则表示为 NULL DLLElement *prev; //上一个元素,如果指向开始,则表示为 NULL int key; }; class DLList { public: DLList(); //初始化链表 ~DLList(); //清除链表内存 void Prepend(DLLElement *item); //添加到链表的头 void Append(DLLElement *item); //添加到链表尾 DLLElement void showlist();//输出链表 bool IsEmpty(); //返回链表的情况 void SortedInsert(DLLElement *item, int sortkey); *Remove(); //删除从链表的头 DLLElement *SortedRemove(int sortKey);
private: DLLElement *first;//链表的头,如果为空,则为 NULL DLLElement *last; //链表的尾,如果为空,则为 NULL }; Dllist.cc #include "dllist.h" #include #include DLLElement::DLLElement(int node_key) { key=node_key; prev=next=NULL; } DLList::DLList()//初始链表 { first = NULL; last = NULL; first = last; } DLList::~DLList() { DLLElement *be_del; if(!IsEmpty()) return;//判断是否要清除链表内存 for(;first;)//清除链表 { be_del = first; first = first->next; delete be_del; } } void DLList::Prepend(DLLElement *item) { DLLElement *temp;//要追加的元素
if(IsEmpty())//判断链表的元素如果为空则执行,否则执行 else { first=last = item; item->next=NULL; item->prev=NULL; } else { item->next=first; item->prev=NULL; first->prev=item; first=item; } int for(temp = first->next;temp;temp= temp->next) min_key = first->next->key;//定义一个值等于原链表的第一个元素 if(temp->keykey; item->key=min_key-1;//将 item 的值定义为最小的 } void DLList::Append(DLLElement *item) { DLLElement *temp; //要附加的元素 if(IsEmpty())//同上 { first=last = item; item->next=NULL; item->prev=NULL; return; } else { item->prev=last; item->next=NULL; last->next=item; last=item; } int for(temp = first;temp!=last && temp;temp= temp->next) max_key = first->key;//定义一个值等于原链表的第一个元素 if(temp->key>max_key) max_key= temp->key; item->key=max_key+1;//将 item 的值定义为最大的 } DLLElement *DLList::Remove()
{ DLLElement *keyPtr;//要移除的元素 if(IsEmpty())//判断链表情况 { return NULL; } else if(first != NULL && last!=NULL&& first==last)//判断是否只有一个元素 { keyPtr = first; first = last = NULL; return keyPtr; } else//多个元素情况 { keyPtr = first; first->next->prev = NULL; first = first->next; return keyPtr; } } void DLList::SortedInsert(DLLElement *item,int key)//插入排序 { DLLElement *p;//插入的元素 int k; k=1;//这里设置是否要并发 0 为不要,1 为要。 if(IsEmpty() )//判断链表是否为空 { first = last =item; first->prev = last->next = NULL; } else if(first->key >= key)//判断值的位置这里插入头 { first->prev = item; item->next = first; if(k==1) { } currentThread->Yield(); first = item; first->prev = NULL; } else if(last->key < key)//插入尾 {
last->next = item; item->prev = last; if(k==1) { } currentThread->Yield(); last = item; last->next = NULL; } else { for(p=first->next; p!=NULL; p=p->next) { if(p->key >= key) item->prev = p->prev; item->next = p; currentThread->Yield(); p->prev->next = item; p->prev = item; break; { } } } } DLLElement *DLList::SortedRemove(int sortkey)//同上 { DLLElement *p; if(IsEmpty() ) else if(first == last) { return NULL; p = first; first = last = NULL; return p; } else if(first->key == sortkey) { p = first; currentThread->Yield();//调用以强制线程切换 first->next->prev = NULL;
currentThread->Yield(); first = first->next; return p; } else if(last->key == sortkey) { p = last; currentThread->Yield(); last->prev->next = last; currentThread->Yield(); last = last->prev; return p; } else { for(p=first->next; p->next != NULL ;p=p->next) { if(p->key == sortkey) { } p->prev->next = p->next; //currentThread->Yield(); p->next->prev = p->prev; return p; } } return NULL; } void DLList::showlist()//输出链表 { DLLElement *p; for(p=first;p;p=p->next) " ; cout<key<<" cout<
{ } if(first==NULL && last==NULL) return TRUE; else return FALSE; Dllist-driver.cc #include "dllist.h" #include int A[]={0,5,2,9}; int B[]={0,4,3,8}; void Insertlist(int n,DLList *list,int which)//插入链表 { int value; DLLElement *item; for(int i=1;i<=n;i++) { if(which == 0) { { value = A[i]; } else if(which == 1) value = B[i]; } item=new DLLElement(value); cout<<"线程"<key<SortedInsert(item,value); cout<<"执行线程"<key<<"后输出链表:"; list->showlist(); cout<
{ { } { } if(which == 0) del = A[i]; else if(which == 1) del = B[i]; "<<"删除之前的链表"; cout<<"线程"<showlist(); item = list->SortedRemove(del); cout<<"执行线程"<showlist(); cout<
分享到:
收藏