实验一体验 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<