回 帖 发 新 帖 刷新版面

主题:[原创]模拟多线程程序(C++实现)

操作系统老师布置的作业,我是我们班级第一个实现的,成就感异常,这里公布一下源代码!


#include<iostream.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>


class multithread   //多线程类
{
      private:
              char s[1000];       //某线程工作状态字符型记录数组
              int sum;        //某个对象存储状态的字符串型数组的个数
              
      public:
       multithread(){xpiot=0;for(int i=0;i<1000;i++)s[i]=' ';};  
              ~multithread(){};
              void randcpu();            //产生某个线程某一次所需的CPU时间的随机函数
              void randio();             //产生某个线程某一次所需的外围io设备时间的随机函数
              void store();       //存储线程记录函数
              void print();       //输出运行结果
     static int sumtime;    //系统总时间
     int xpiot;      //当前线程与其后io运行时间之和
};

int multithread::sumtime=0;

void  multithread::randcpu()
{
    int temp;
         temp=rand()%3+1;
    for(sum=sumtime;sum<sumtime+temp;sum++)
    s[sum]='+';
         sumtime+=temp;    
}

void  multithread::randio()
{
   int temp;
   temp=rand()%3+3;
   for(sum=sumtime;sum<sumtime+temp;sum++)
    s[sum]='-';
        xpiot=sumtime+temp;     
}

void  multithread::store()
{
   
   for(sum=xpiot;sum<sumtime-xpiot;sum++)
    s[sum]=' ';
}

void  multithread::print()
{
   int i;
   for(i=0;i<xpiot;i++)
    cout<<s[i];
}


void main()
{
      int a=0,b=0;
      multithread mth[4];
   time_t t;
      srand((unsigned) time(&t));
   while(a!=32)
       {
          
              if(mth[b].xpiot<=mth[b].sumtime)
              {
                 mth[b].store();
                 mth[b].randcpu();
                  mth[b].randio();
        a++;
     b=(b+1)%4;
              }
    else
    {
     mth[b].sumtime++;
    }
  
   }
      for(b=0;b<4;b++)
      {
          mth[b].print();
          cout<<endl;      
      }
}

回复列表 (共21个回复)

11 楼

看一下操作系统的进程和线程这一章吧,
操作系统的教材应该都有这方面的介绍的。

12 楼

http://upload.programfan.com/upfile/200601070306531.rar

给你看个真正的多线程的

13 楼

楼上兄弟们,谢谢了!

[em12]

14 楼

看完了代码,挺有趣的,收益不少。但只是4个线程逐个执行,这应该叫做批处理系统才对。

15 楼

最近又学了不少知识,发觉这个做得确实有一些粗糙,不过觉得自己的思想不错,还是很值得鼓励的,毕竟刚刚开始么,我会继续加油的,也谢谢各位给我的提点,呵呵

16 楼

[quote]意思是到了,但不是真的模拟OS多线程,在主函数里定义的multithread对象,按说都应该是这个进程的一个线程,而你的只是一个数组,建议用链队列把就绪的线程按先来先服务的方法入队(可以在multithread类的构造函数里实现),出队运行,时间片到把它入队,我想这才是和OS的模拟,不管你在主函数里定义多少个multithread对象,它都会自动入就绪队,先来先服务,不过你要想一想怎么有效的保存未能完成的线程里的数据,不知道OS是如何保存未能完成的线程里的数据的,谁知道说一下原理,我们模拟一下!个人意见!![em2][/quote]

在线程调度的 OS 中,把被中断的线程放到一个结构当中,WINDOWS 下叫
KPCR,其中包含了当前线程的堆栈,上下文等所有信息。 *nix 等是进程
调度。不论哪种,现代 OS 都是以优先级+时间片联合作为中断及调度
依据。

17 楼

18 楼

厉害,顶一下!多线程在我大脑里没有留下太多的痕迹。真是惭愧不已!

19 楼

赫赫,楼主的精神值得敬仰,但客观的说,你这不算一个多线程的程序(请原谅我的直

言)。介绍多进程多线程的书籍,有这样一本,建议楼主看一下,一定获益匪浅的。

Win32 多线程程序设计 候捷译

20 楼

谢谢上面的提点,我会继续努力的!

我来回复

您尚未登录,请登录后再回复。点此登录或注册