主题:[原创]模拟多线程程序(C++实现)
奋斗从C开始
[专家分:210] 发布于 2005-10-22 11:23:00
操作系统老师布置的作业,我是我们班级第一个实现的,成就感异常,这里公布一下源代码!
#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 楼
奋斗从C开始 [专家分:210] 发布于 2006-01-07 00:34:00
看一下操作系统的进程和线程这一章吧,
操作系统的教材应该都有这方面的介绍的。
12 楼
pcboyxhy [专家分:2910] 发布于 2006-01-07 03:08:00
http://upload.programfan.com/upfile/200601070306531.rar
给你看个真正的多线程的
13 楼
dragon188 [专家分:4740] 发布于 2006-01-07 08:49:00
楼上兄弟们,谢谢了!
[em12]
14 楼
euc [专家分:4310] 发布于 2006-01-07 20:27:00
看完了代码,挺有趣的,收益不少。但只是4个线程逐个执行,这应该叫做批处理系统才对。
15 楼
奋斗从C开始 [专家分:210] 发布于 2006-04-02 12:20:00
最近又学了不少知识,发觉这个做得确实有一些粗糙,不过觉得自己的思想不错,还是很值得鼓励的,毕竟刚刚开始么,我会继续加油的,也谢谢各位给我的提点,呵呵
16 楼
fucker [专家分:680] 发布于 2006-04-13 01:55:00
[quote]意思是到了,但不是真的模拟OS多线程,在主函数里定义的multithread对象,按说都应该是这个进程的一个线程,而你的只是一个数组,建议用链队列把就绪的线程按先来先服务的方法入队(可以在multithread类的构造函数里实现),出队运行,时间片到把它入队,我想这才是和OS的模拟,不管你在主函数里定义多少个multithread对象,它都会自动入就绪队,先来先服务,不过你要想一想怎么有效的保存未能完成的线程里的数据,不知道OS是如何保存未能完成的线程里的数据的,谁知道说一下原理,我们模拟一下!个人意见!![em2][/quote]
在线程调度的 OS 中,把被中断的线程放到一个结构当中,WINDOWS 下叫
KPCR,其中包含了当前线程的堆栈,上下文等所有信息。 *nix 等是进程
调度。不论哪种,现代 OS 都是以优先级+时间片联合作为中断及调度
依据。
17 楼
冷月星光 [专家分:16520] 发布于 2006-04-13 11:19:00
强
18 楼
foxmishy [专家分:40] 发布于 2006-04-13 14:47:00
厉害,顶一下!多线程在我大脑里没有留下太多的痕迹。真是惭愧不已!
19 楼
casm [专家分:350] 发布于 2006-04-14 23:07:00
赫赫,楼主的精神值得敬仰,但客观的说,你这不算一个多线程的程序(请原谅我的直
言)。介绍多进程多线程的书籍,有这样一本,建议楼主看一下,一定获益匪浅的。
Win32 多线程程序设计 候捷译
20 楼
奋斗从C开始 [专家分:210] 发布于 2006-04-15 23:00:00
谢谢上面的提点,我会继续努力的!
我来回复