这完全取决于 10ms 的要求。
迭代之间有 10ms 的延迟
如果应用程序需要在迭代之间有 10 毫秒的延迟,那么睡眠就可以了。假设work()
需要 7 毫秒才能完成,时间线将导致以下结果:
Time | Action
-------+------------
0.000s | begin work
0.007s | finish work, block
0.017s | finish blocking, begin work
0.024s | finish work, block
0.034s | finish blocking, begin work
可能值得考虑使用 Boost.Threadthis_thread::sleep_for() http://www.boost.org/doc/libs/1_53_0/doc/html/thread/thread_management.html#thread.thread_management.this_thread.sleep_for为了可读性:
#include <boost/thread.hpp>
int main()
{
for (;;)
{
work();
boost::this_thread::sleep_for(boost::chrono::milliseconds(10));
}
}
迭代之间最大延迟 10 毫秒
如果迭代之间的最大延迟为 10 毫秒,则执行工作所花费的时间需要从 10 毫秒延迟中减少。假设work()
需要 7 毫秒才能完成,时间线将导致以下结果:
Time | Action
-------+------------
0.000s | begin work
0.007s | finish work, block
0.010s | finish blocking, begin work
0.017s | finish work, block
0.020s | finish blocking, begin work
The 同步使用计时器 http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/tutorial/tuttimer1.html教程可能是一个很好的起点。需要考虑的一点是 Boost.Asio 提供了一些计时器。如果 10ms 延迟不应受到系统时钟更改的影响,则考虑使用steady_timer http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/reference/steady_timer.html。否则,deadline_timer http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/reference/deadline_timer.html应该没事。
#include <boost/asio/steady_timer.hpp>
boost::asio::io_service io_service;
boost::asio::steady_timer timer(io_service);
int main()
{
for (;;)
{
timer.expires_from_now(boost::chrono::milliseconds(10));
work();
timer.wait();
}
}
另一个考虑因素是,如果work()
需要 13 毫秒才能完成,则工作之间不会有延迟,因为已超过最大延迟。然而,这导致work()
每 13 毫秒完成一次,而不是work()
每 10 毫秒执行一次。
Time | Action
-------+------------
0.000s | begin work
0.013s | finish work, block
0.013s | finish blocking, begin work
0.026s | finish work, block
0.039s | finish blocking, begin work
每 10 毫秒执行一次工作
如果完成所需的时间work()
超过延迟,则work()
不会每 10ms 执行一次。为了实现这一点,可能需要使用多个线程。以下是一个时间线,其中有 2 个线程异步执行每 10 毫秒计划一次的工作,但需要 13 毫秒才能完成:
Time | Thread A | Thread B
-------+----------------------------+---------------------------
0.000s | schedule work, begin work |
0.010s | | schedule work, begin work
0.013s | finish work, block |
0.020s | schedule work, begin work |
0.023s | | finish work, block
0.030s | | schedule work, begin work
0.033s | finish work, block |
The 异步使用计时器 http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/tutorial/tuttimer2.html可以提供基本介绍。总体想法是将工作添加到io_service
,并且每 10 毫秒就有一个正在运行的线程io_service
将被选择调用work()
。线程池大小可以根据时间量增加或减少work()
需要完成。如果工作需要 7 毫秒,则单个线程可以异步等待计时器。
#include <boost/asio/steady_timer.hpp>
boost::asio::io_service io_service;
boost::asio::steady_timer timer(io_service);
void handle_timer(const boost::system::error_code& error);
void schedule_work()
{
// Schedule more work.
timer.expires_from_now(boost::chrono::milliseconds(10));
timer.async_wait(&handle_timer);
}
void handle_timer(const boost::system::error_code& error)
{
if (error) return;
schedule_work();
work();
}
int main()
{
// Add work to io_service.
schedule_work();
// Create 2 threads that will run io_service.
boost::thread_group threads;
for (std::size_t i = 0; i < 2; ++i)
threads.create_thread(boost::bind(
&boost::asio::io_service::run, &io_service));
// Wait for threads to finish.
threads.join_all();
}
在引入并发以满足截止日期时,请验证work()
是线程安全的。