| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5299 人关注过本帖
标题:[原创]DOS下多线程的实现(Demo程序)
取消只看楼主 加入收藏
RockCarry
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
结帖率:95.65%
收藏
 问题点数:0 回复次数:4 
[原创]DOS下多线程的实现(Demo程序)
*/ --------------------------------------------------------------------------------------
*/ 出自: 编程中国 http://www.bc-cn.net
*/ 作者: RockCarry
*/ 时间: 2007-7-7 编程论坛首发
*/ 声明: 尊重作者劳动,转载请保留本段文字
*/ --------------------------------------------------------------------------------------

在 DOS 下如何实现多线程,这程序将会告诉你怎么做。

本程序在 Turbo C 2.0 下调试通过,采用了最简单的时间片轮转法,实现了多线程的系统,程序尽量采用了最简洁的技术来实现多任务的系统,主要使用到了C标准库中的setjmp和longjmp两个函数,程序绝大部分都是采用C语言书写,但是仍然不可避免的采用了三句内嵌汇编,来进行线程堆栈的切换。
我可以向你保证,这绝对是一个可靠的多线程实现方式,但是需要指出的是,由于DOS下的系统调用,都是不可重入的,所以尽管我的多线程实现已经很可靠了,但是当你在多个线程中同时调用了DOS的系统调用,仍然会出现问题。

整个系统,是使用时钟中断处理程序,来完成任务的调度,程序的代码很简单,但是却很难被看懂。毕竟,涉及到任务调度的一些原理,没有一定的基础,和理解能力是不行的。

我个人一直都在思考多任务的实现原理这方面的问题,最近终于想通了。这个东西不复杂,但是确实很难理解。要花很多时间去思考和领悟。网上和教科书上,所给出的东西讲得都太过简单,根本不具备指导性的价值,并且也没有给出具体的实现方法和具体的代码。
在这里,我给出一个,我自己实现的多线程系统,供大家参考。代码很简单,没有实现复杂的任务调度,仅仅是一个时间片轮转的调度算法,但是足以说明问题。有机会,可以进一步完善,更复杂的调度,线程之间的同步等等。
其实我也有看过ucos的代码,当时也希望认真阅读,不过到最后发现自己真的看不懂(不知道是他的代码太烂还是我的理解能力太差)。后来索性自己去思考,今天总算成功了。

今天先把代码给出来,以后有时间,再写一篇文档详细讲讲这个。

下载地址:http://www.freewebs.com/chenkai/download/thread.rar
A4S6zOru.rar (10.93 KB) [原创]DOS下多线程的实现(Demo程序)




RockCarry
2007-7-7




搜索更多相关主题的帖子: Demo 线程 DOS 
2007-07-07 19:07
RockCarry
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
收藏
得分:0 
目前只是一个Demo,重在示出原理
DOS调用不可重入的问题的确很麻烦,导致许多库函数都不能对这个多线程系统进行很好的支持,比如说,如果两个线程里面都同时有printf函数,很有可能就会导致程序异常。一开始我在调试时打算在两个线程里面都用printf函数,结果怎么都不行,还以为是自己在多线程系统上的设计和实现有问题。后来才想到DOS功能调用不可重入的问题。因此,目前这个多线程系统的线程函数中都不能有DOS调用,这也限制了其使用范围。
这个系统的可靠性还需要进一步验证,后面这个特性也将会加入到我设计的库中。其实这个代码的精妙之处,真是用言语难以表达的,大家认真体会吧。
2007-07-08 12:56
RockCarry
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
收藏
得分:0 

呵呵,不必这么客气
我是boy,这个就不用肯定了
可能是在这个论坛注册的时候填错了信息
to gzdillon, 不知道你说所的“在1000M空间里面实现...”具体指的是什么意思。
网络通讯的话,最好是借助操作系统的 API,如果自己开发工作量会很大,并且不能保证通用性。因此在 DOS 下,就不用考虑网络通讯的问题。
寻路算法,不知道具体指的是什么,似乎在游戏里面有一个寻路的算法。磁盘读写等操作,一般都会借助操作系统的API,因此不用自己写。
如果是想自己全部实现以上的东西,难度确实很大的。

2007-08-08 19:53
RockCarry
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
收藏
得分:0 
回复:(gzdillon)回复:(RockCarry)呵呵,不必这么...
在 DOS 下要完成你所说的功能,难度还是很大的,最好还是选用 windows 平台吧。
2007-08-12 23:00
RockCarry
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
收藏
得分:0 
如果是工程上的应用就用windows啦,如果是研究性质的,就最好自己尝试去实现一些底层的东西。
2007-08-18 20:14
快速回复:[原创]DOS下多线程的实现(Demo程序)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.050674 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved