我想实现一种方法来安排稍后执行的任务。该接口类似于 JavaScript 的setTimeout(function, milliseconds)
.
在我的应用程序中,某些资源由线程拥有。为了避免竞争条件,它们必须始终从同一个线程访问。如果其他线程想要访问资源,它们必须将任务对象分派给资源线程。
所以我需要解决的两个问题是:
- 将任务分派给线程
- 延迟调用
第一个问题通过使用无锁队列快速解决,该队列在消费端具有资源线程。(我使用 TBB 的 concurrent_bounded_queue。)然而,第二个问题对我来说并不那么明显。我可以想到两种策略:
- 为每个任务启动一个新线程。该线程将休眠所需的延迟,然后将任务分派到并发队列。
- 仅启动一个线程,该线程运行一个循环,该循环迭代计划任务并在它们的等待时间到期时调用它们。
我对这两种方法都进行了试验,我倾向于第一种,因为它简单可靠,而第二种更容易出现细微的错误。第一种方法将此委托给 OS 线程调度程序。
但是,第一个解决方案确实创建了很多短期线程,而我通常会听到重用线程的建议。