如何在c ++中为每个对象实现计时器?

时间:2013-08-11 16:48:05

标签: c++ timer

我需要实现以下方案,请帮助我:

  1. 将维护一个队列,其中包含一些对象。
  2. 当一个对象插入队列时,将为该对象启动一个计时器。
  3. 只要在该对象上发生事件,就会发送一个信号(事件可能像超时,某些错误等)。
  4. 将捕获此对象发生的事件,并将接收对象ID。需要对象Id来区分队列中存在的对象并采取适当的操作。
  5. 我的方法对大量对象不起作用如下:

    1. 为每个对象创建一个线程,该线程将对象ID传递给thread_function1(void *object_id);并使用sleep()作为该对象的计时器。
    2. 现在对于其他对象,我必须通过创建new thread_function2(void *object_id);来做同样的事情 上述方法不起作用,因为我希望这是动态的。
    3. 操作系统:Linux。

      我想用c ++实现这个,我从来没有实现过这个,所以我需要你的帮助和指导才能继续前进。任何在线教程,参考都会有很大帮助。 提前谢谢。

3 个答案:

答案 0 :(得分:2)

早在2004年,我开始撰写一系列名为“实际测试”的博客文章,演示了如何测试C ++计时器实现。该系列包含许多版本的全功能轻量级计时器队列,它使用单个线程为计时器提供服务(当然,一旦它触发,您可以将计时器事件传递给线程池,但队列本身只需要一个线程工作)。

该代码适用于Windows,因此您必须稍微调整一下。

该代码旨在与数千个网络连接一起使用,其中每个连接可能有一个或多个与之关联的计时器。它已经被具有超过10,000个连接的系统所使用,并且运行良好且效率很高。

在第23集中,我添加了一个使用计时器轮而不是计时器队列的替代实现,并讨论了获得新数据结构所带来的性能提升所需的权衡。

系列节目开始here

如果您只想要最新的工作代码,那么可以从第31集here下载。

代码具有良好的单元测试覆盖率(我希望,毕竟这是博客文章的重点),并且可以使用代码下载测试。

答案 1 :(得分:0)

答案 2 :(得分:0)

简短的回答是:不要使用sleep()。这是一个尴尬的旧界面,你不应该在任何代码中使用它。

特别是,sleep()并不是最不感知线程的。而是使用pthread库中的函数来满足您的时序需求。例如,您可以使用pthread_cond_timedwait()来限制线程等待某个事件的时间。

不幸的是,创建pthread库的人们忘记了创建pthread兼容版本的标准系统调用,如read()或write()。编程一个线程,等待以下任何一个:
A)另一个线程发出某种状态信号 B)在网络连接上接收数据
C)超时
仍然是一团糟。一种解决方案是使用select()和/或poll()来等待数据(情况B)或超时(情况C),并使用管道/ fifo返回给自己来发送来自另一个thead的信号(情况A)。为此,将管道的读取端添加到select()集合中,如果需要发出条件信号,则让另一个线程向其写入一个字节。

这个A / B / C场景的替代解决方案是拥有一个"读者助手"线程,无限期地等待网络数据(情况B),而主线程使用pthread_cond_timedwait()用于A和C.辅助线程将通过pthread_cond_signal发信号通知数据到达,因此基本上将情况B转换为情况A.顺便说一句:如果主线程在任何时候选择中止连接,它可能只是强制关闭()网络连接,这也将终止等待帮助线程的read()调用。