我需要实现以下方案,请帮助我:
我的方法对大量对象不起作用如下:
thread_function1(void *object_id);
并使用sleep()
作为该对象的计时器。new thread_function2(void *object_id);
来做同样的事情
上述方法不起作用,因为我希望这是动态的。操作系统:Linux。
我想用c ++实现这个,我从来没有实现过这个,所以我需要你的帮助和指导才能继续前进。任何在线教程,参考都会有很大帮助。 提前谢谢。
答案 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()调用。