nachos下双向量表的设计(含并发错误)1

                  nachos下双向量表的设计

一.           实验目的

本次实验的目的在于对nachos进行熟悉,并初步体验nachos下的并发程序设计

二.           实验内容

安装nachos;

用C++实现双向有序链表;

在nachos系统中使用你所写的链表程序并演示一些并发错误

三.           实验运行实例

一.           实验相关步骤

  1. 实验需要编写三个相关文件,它们是dllist.h、dllist.cc、dllist-driver.cc,在dllist.h定义了双向链表,即定义了两个类,element和dllist,其具体代码如下:
class element

{

public:

int key;

element *prev;

element *next;

 element(int this_key);

 element();

~element();

};

class dllist

{

public:

 dllist();

 ~dllist();

 dllist(int key);

element *head;

element *end;

void sortedinsert(int key);

void sortedremove();

void remove(int this_key);

void printfN();

};
void dllist::sortedremove()
{//删除链表中的第一个数据直到没有数据了。
    element *temp=NULL;
    element *temp_next=NULL;

    //                printf("aa\n");
    if(head->next!=NULL&&head->next->key!=101)
//    if(head->next!=NULL)
        {

    //                printf("bb\n");
                if(    head->next->next!=NULL)
                {
                     temp=head->next;
                     temp_next=temp->next;
                    printf("%d\n",temp->key);
    //                printf("gg\n");
                    free(temp);

    //                printf("hh\n");
                    if(flag!=6&&flag!=7)        head->next=NULL;
                    if(flag==5||flag==6||flag==7)
                    {
                    printf("five-interrupt\n");
                    currentThread->Yield();
                    }
                    head->next=temp_next;
                    temp_next->prev=head;
                }
                else{
                 temp=head->next;
                    printf("%d\n",temp->key);

    //                printf("ii\n");
                    free(temp);
    //                printf("jj\n");
                        if(flag==5||flag==6)
                        {
                        printf("five-interrupt\n");
                        currentThread->Yield();
                        }
    //                printf("jj\n");
                    head->next=NULL;
                    }
        }
    
            
     else if(head->next==NULL)
         printf("\n链表已经没有数据\n");
    //                printf("ee\n":);
    temp=head;
//    printf("a");
/*    while(temp->next!=NULL)
        {
            printf("%d\n",temp->key);
            temp=temp->next;
        }
        printf("%d\n",temp->key);
    printf("b");*/
}

 

dllist.cc中实现了双向链表的相关功能,包括element的构造函数、析构函数以及dllist的构造函数、析构函数和sortedinsert()、printfN()、sortedremove()、remove()等。而在dllist-driver.cc中实现了插入N个元素和删除N个元素,具体实现如下:

 

  1. 完成代码编写后需要在nachos-3.4/code/Makefile.common中添加相关路径,在THREAD_H中加入dllist.h, 在THREAD_C中dllist.cc和dllist-driver.cc、THREAD_O中加入dllist.o和dllist-driver.o。
  2. 接着,在nachos-3.4/code/threads/下执行make depend和make命令。
  3. 另外,还要在threadtest.cc文件中修改相关代码,具体如下:
void

ThreadTest1()

{

    DEBUG('t', "Entering ThreadTest1");

    for(int i=0;i< Thread_num;i++)            //Thread_num个线程做插入和删除//N个元素的工作

{

    Thread *t = new Thread("forked thread");

    t->Fork(SimpleThread,i);

}
  1. 运行时在nachos-3.4/code/threads/下输入./nachos Thread_num Node_num Flag,其中参数分别为线程数,节点数,错误标志,当错误标志位0是代表正常情况。

二.说明

此次实验通过对并发线程的设计对双向链表的操作,更清晰地了解线程间的运行情况。还通过多线程对双向链表操作所产生错误的演示,加强了我们线程工作原理的认识。

此外,多线程对双向链表的操作所产生的错误,主要有如下几种,当错误标志为1 时,会发生如下所述错误:线程0在插入N个元素后被线程1说抢占插入N个元素,然后线程0进行删除N咯元素的操作,而由于插入时时按照大小顺序插的,导致了线程0删除的不是自己插入的N个元素。

当错误标志位2时,有如下错误:线程0插入1个元素后,被线程1抢占,线程1插入一个元素后,又被线程0抢占插入,直至两个线程完成插入过程。由于插入时时按大小排序插入的,故导致,在删除时,两个线程没能正确的删除它们自己插入的元素。

本次实验作为操作系统本学期的第一次实验,由于对nachos环境不是特别熟悉,所以刚上手时有一定难度,但建立双向链表的过程较为基础。

posted @ 2012-12-05 15:29  xjx_user  阅读(1016)  评论(0编辑  收藏  举报