【发布时间】:2019-03-27 03:43:19
【问题描述】:
我正在尝试实现(在 C++11/14 中)一种在多个时间戳执行函数的方法。场景如下:
有一个主线程可以随时接收请求。请求可以是以下格式之一:remove object X at time Y 或 insert object X at time Y,其中 X 是我用来标识存储中的对象的 id,Y 是 Unix 时间戳。时间分辨率将排在第二位。
一种直观的方法是在新请求到来时创建一个新线程。然后,这个新线程会休眠请求中指定的一段时间,并在唤醒时移除/添加一个对象。
另一种方式是轮询。主线程可以存储收到的请求。然后一个单独的线程可以每秒检查所有收到的请求,看看是否需要进行任何删除/插入。
我提到的两种方法似乎都会产生巨大的开销,所以我正在寻找另一种方法。
【问题讨论】:
-
你怎么知道开销很大?你能在这里分享一些代码吗?
-
您使用的时间分辨率是多少?秒、毫秒还是微秒(或其他)?
-
有一个增量列表,其中包含“执行列表中第一项的时间”。警报处理代码处理唤醒并执行适当的操作。当一个新事件到达时,如果它应该在下一个事件发生之后发生,只需将其插入到增量列表中的正确位置即可。当新事件应该在列表中的当前第一项之前发生时,将其插入列表并唤醒执行线程,让它知道有一个新的“列表中的第一个”项要执行。
-
一个增量列表意味着如果第一个项目将在 10 秒内执行,下一个在 15 秒内执行,第三个在 18 秒内执行,您的增量列表将记录 'in 10 seconds', '再过 5 秒' 和 '再过 3 秒' 。您将记录足够的时间信息,以便该进程可以在提早唤醒时重新同步。
标签: c++ multithreading asynchronous async-await