我正在研究Bjarne用C++编程语言进行的一些练习。我对第12章末尾的问题11感到困惑:
(*5)设计并实现了一个用于编写事件驱动模拟的库。提示:。..。类任务的对象应该能够保存其状态并恢复该状态,以便它可以作为协同线运行。特定的任务可以定义为从任务派生的类的对象。由任务执行的程序可以定义为虚拟函数。..。应该有一个调度器来实现虚拟时间的概念。..。任务需要沟通。为此设计一个类队列。..。
我不太清楚这究竟是要什么。任务是一个单独的线程吗?(据我所知,在没有系统调用的情况下创建新线程是不可能的,因为这是一本关于C++的书,我不相信这就是目的。)没有中断,如何才能启动和停止运行的函数?我假设这将涉及到繁忙的等待(也就是说,不断循环并检查一个条件),尽管我不知道如何将其应用于一个可能在一段时间内不会终止的函数(例如,如果它包含一个无限循环)。
编辑:请看我下面的文章和更多的信息。
发布于 2008-12-16 00:25:11
提示:。
是对早期版本的CFront附带的一个旧的合作多任务库的引用(您也可以在该页面下载)。
如果你读了"一组用于协同例程式编程的C++类“的报纸,事情会变得更有意义。
增加一点:
我不是一个老到可以使用任务库的程序员。但是,我知道C++是在Stroustrup用Simula编写了一个模拟程序之后设计的,它具有许多与任务库相同的属性,所以我一直对它感到好奇。
如果我要实现本书中的练习,我可能会这样做(请注意,我还没有测试过这段代码,甚至没有尝试编译它):
class Scheduler {
std::list<*ITask> tasks;
public:
void run()
{
while (1) // or at least until some message is sent to stop running
for (std::list<*ITask>::iterator itor = tasks.begin()
, std::list<*ITask>::iterator end = tasks.end()
; itor != end
; ++itor)
(*itor)->run(); // yes, two dereferences
}
void add_task(ITask* task)
{
tasks.push_back(task);
}
};
struct ITask {
virtual ~ITask() { }
virtual void run() = 0;
};我知道人们会不同意我的一些选择。例如,使用struct作为接口;但是structs的行为是默认情况下是公共的(在默认情况下,从类继承是私有的),而我认为从接口继承私有没有任何价值,那么为什么不将公共继承作为默认继承呢?
这样做的想法是调用ITask:: run ()将阻塞调度器,直到任务到达可以被中断的点,此时任务将从run方法返回,直到调度器再次调用运行才能继续。“合作多任务”中的“合作”是指“任务表示何时可以被打断”(“协同”通常指“合作多任务”)。一个简单的任务只能在它的run()方法中做一件事,一个更复杂的任务可以实现一个状态机,并且可以使用它的run()方法来确定对象当前处于什么状态,并根据该状态调用其他方法。任务必须偶尔放弃控制才能工作,因为这就是“协作多任务”的定义。这也是为什么所有现代操作系统都不使用协同多任务处理的原因。
该实现没有(1)遵循公平的调度(可能保持在任务的run()方法中花费的时钟滴答总数,并跳过相对于其他任务使用了太多时间直到其他任务“追赶”为止的任务),(2)允许移除任务,甚至(3)允许停止调度器。
至于任务之间的通信,您可以考虑查看计划9的任务或罗布·派克以获得灵感(“Newsqueak的”下载包括一篇论文“Newsqueak的实现”,其中讨论了在有趣的虚拟机中传递消息)。
但我相信这是Stroustrup脑海中的基本骨架。
发布于 2008-12-16 01:20:37
以下是我对“事件驱动模拟”的理解:
大多数生产事件驱动的模拟运行在一个线程中。由于它们的本质是复杂的,所以试图同步多线程模拟往往会增加指数级的复杂性。尽管如此,还有一个名为分布交互仿真 (DIS)的多进程军事模拟标准,它使用预定义的TCP消息在进程之间传输数据。
编辑:定义建模和仿真之间的区别是很重要的。模型是系统或过程的数学表示。仿真是由一段时间内执行的一个或多个模型建立的。同样,事件驱动的仿真从一个事件跳到另一个事件,而时间驱动的仿真以固定的时间步长进行。
发布于 2008-12-15 23:14:27
在我看来,这个练习要求你实现一个协作的多任务调度器。调度程序在虚拟时间内运行(您在任何级别定义/实现时间),根据队列选择要运行的任务(请注意,您需要实现一个任务),当当前任务完成时,调度程序选择下一个任务并开始运行。
https://stackoverflow.com/questions/369948
复制相似问题