我正在完成Bjarne Stroustrup的C++编程语言中的一些练习.我对第12章末尾的问题11感到困惑:
(*5)设计并实现用于编写事件驱动模拟的库.提示:....类任务的对象应该能够保存其状态并恢复该状态,以便它可以作为协程运行.可以将特定任务定义为从任务派生的类的对象.由任务执行的程序可以被定义为虚拟功能.......应该有一个实现虚拟时间概念的调度程序.......任务需要沟通.为此设计一个类队列....
我不确定这究竟是什么要求.任务是一个单独的线程吗?(据我所知,没有系统调用就不可能创建新的线程,因为这是一本关于C++的书,我不相信这是意图.)没有中断,如何启动和停止运行功能?我假设这将涉及忙等待(也就是说,连续循环并检查条件),虽然我看不出如何将其应用于可能不会终止一段时间的函数(例如,如果它包含无限循环) .
编辑:请参阅下面的帖子了解更多信息.
以下是我对"事件驱动模拟"的理解:
控制器处理事件队列,调度在特定时间发生的事件,然后在队列上执行top事件.
活动在预定时间瞬间完成.例如,"移动"事件将更新模拟中实体的位置和状态,使得状态向量在当前模拟时间有效."感知"事件必须确保所有实体的状态都在当前时间,然后使用一些数学模型来评估当前实体能够感知其他实体的程度.(想想机器人在板上四处走动.)
因此,时间不连续,从事件跳到事件.将其与时间驱动的模拟进行对比,其中时间以离散步骤移动,并且每个时间步骤更新所有实体的状态(大多数Simulink模型).
然后事件可以以其自然速率发生.在模拟中以最精确的速率重新计算所有数据通常没有意义.
大多数生产事件驱动的模拟都在一个线程中运行.它们本质上可能很复杂,因此尝试同步多线程模拟往往会增加指数层的复杂性.话虽如此,有一个称为分布交互式仿真(DIS)的多进程军事模拟标准,它使用预定义的TCP消息在进程之间传输数据.
编辑:定义建模和模拟之间的差异非常重要.模型是系统或过程的数学表示.模拟是根据一段时间内执行的一个或多个模型构建的.同样,事件驱动的模拟在事件之间跳跃,而时间驱动的模拟在恒定的时间步骤进行.