C++ 如何重新启动boost截止时间计时器
我有一个要求,我的计时器必须根据2个条件重置,以较早发生的为准C++ 如何重新启动boost截止时间计时器,c++,boost-asio,C++,Boost Asio,我有一个要求,我的计时器必须根据2个条件重置,以较早发生的为准 计时器到期时 当满足特定条件时(如内存达到特定限制) 我将采取以下步骤: boost::asio::io_service io; boost::asio::deadline_timer t(io, boost::posix_time::seconds(1)); boost::mutex mtx1; void run_io_service() { io.run(); } void print(const boost::sy
boost::asio::io_service io;
boost::asio::deadline_timer t(io, boost::posix_time::seconds(1));
boost::mutex mtx1;
void run_io_service()
{
io.run();
}
void print(const boost::system::error_code& /*e*/)
{
boost::mutex::scoped_lock lock(mtx1);
std::cout << "Hello, world!\n";
t.expires_from_now(boost::posix_time::seconds(1));
t.async_wait(print);
std::cout << "Print executed\n";
}
int main()
{
t.async_wait(print);
boost::thread monitoring_thread = boost::thread(run_io_service);
boost::this_thread::sleep( boost::posix_time::seconds(2));
t.cancel();
std::cout << "Resetting Timer\n";
t.async_wait(print);
boost::this_thread::sleep( boost::posix_time::seconds(2));
t.cancel();
io.stop();
monitoring_thread.join();
return 0;
}
boost::asio::io\u服务io;
boost::asio::deadline_timer t(io,boost::posix_time::seconds(1));
boost::互斥mtx1;
无效运行io_服务()
{
io.run();
}
无效打印(常量boost::system::error\u code&/*e*/)
{
boost::mutex::作用域锁定(mtx1);
std::cout您需要设置一个新的过期时间
事实上,在这个事件中,您不必显式取消,因为设置新的experation会隐式取消任何挂起的异步等待
请记住,虽然deadline\u timer对象本身不是线程安全的,因此您需要保持计时器的同步。您需要设置一个新的过期时间
事实上,在这个事件中,您不必显式取消,因为设置新的experation会隐式取消任何挂起的异步等待
请记住,虽然deadline_timer对象本身不是线程安全的,因此您需要保持计时器的同步。第一个问题是,如果出现错误(如被取消),仍将调用处理程序,您需要检查错误代码
void print(const boost::system::error_code& e )
{
if( e ) return; // we were cancelled
// actual error code for cancelled is boost::asio::error::operation_aborted
boost::mutex::scoped_lock lock(mtx1);
std::cout << "Hello, world!\n";
t.expires_from_now(boost::posix_time::seconds(1));
t.async_wait(print);
std::cout << "Print executed\n";
}
和..正如sehe所提到的,您没有安全地处理计时器(或std::cout)。打印重置消息和重置计时器时,应锁定mtx1,否则墨菲定律规定它可能发生在处理程序运行的确切时刻,并将事情搞砸。第一个问题是,如果出现错误(如被取消),仍将调用处理程序,您需要检查错误代码
void print(const boost::system::error_code& e )
{
if( e ) return; // we were cancelled
// actual error code for cancelled is boost::asio::error::operation_aborted
boost::mutex::scoped_lock lock(mtx1);
std::cout << "Hello, world!\n";
t.expires_from_now(boost::posix_time::seconds(1));
t.async_wait(print);
std::cout << "Print executed\n";
}
和..正如sehe所提到的,您没有安全地处理计时器(或std::cout)。打印重置消息并重置计时器时,您应该锁定mtx1,否则墨菲定律规定它可能发生在处理程序运行的确切时刻,并将事情搞砸。您能否澄清此程序预期输出的内容、实际输出的内容,以及您认为这意味着计时器不工作的原因?您能否澄清你期望这个程序输出什么,它实际输出什么,以及为什么你认为这意味着计时器不工作?谢谢。处理错误有帮助。所以,我们不需要每次需要重置计时器时都停止io服务吗?只需在同一个计时器上使用async_wait重置它?不,是的。你可以随时查看文档。(io\u服务
是线程安全的,顺便说一句)谢谢。处理错误很有帮助。所以,我们不需要每次需要重置计时器时都停止io服务吗?只需使用async\u等待相同的计时器就可以重置它吗?不,是的。您可以随时查看文档。(io\u服务
是线程安全的,顺便说一下)