有人可以给我看一个使用 Boost 执行监视器的示例代码吗?这必须在 Redhat (6.0 ??) 上运行
int main(int argc, char *argv[])
{
runTest();//I need a timeout of 30 mins here. That way if the gets hung, process will get killed
}
要实现这一点,您只需要:
auto& inst = boost::test::unit_test_monitor::instance()
inst.p_timeout.set( num_seconds );
execute()
方法调用您的函数。执行监视器的execute()
方法具有以下签名:
int execute( unit_test::callback0<int> const& F );
这意味着它期望函数的签名调用 return 和 int 并且不接受任何参数。如果您的函数与所需的签名不匹配,请使用 boost::bind 或手卷函数包装器。
完整示例:
#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MODULE MyTest
#include <boost/test/included/unit_test.hpp>
#include <boost/test/unit_test_monitor.hpp>
#include <boost/bind.hpp>
#include <unistd.h>
namespace bt=boost::unit_test;
bool DodgyFunc( unsigned wait )
{
for( unsigned x=0; x<wait; ++x)
{
std::cout << "Sleeping....\n";
usleep( 1000000 );
}
return true;
}
BOOST_AUTO_TEST_CASE(MyTestCase)
{
// simple call
std::cout << "Simple call to DodgyFunc, this will pass\n";
BOOST_CHECK_EQUAL( true, DodgyFunc( 5 ) );
// get the execution monitor instance
bt::unit_test_monitor_t& theMonitor = bt::unit_test_monitor_t::instance();
// Set the timeout
theMonitor.p_timeout.set( 3 );
// Now call using the execution monitor
std::cout << "\n\nCall to DodgyFunc, using the execution monitor "
<< "this will timeout and result in an error\n";
theMonitor.execute( boost::bind( DodgyFunc, 10 ) );
}
您不一定需要 Boost 来执行此操作。实现超时的一种非常简单且常用的技术是看门狗定时器。本质上,工作线程或进程定期与管理器线程“签入”。这可以简单地通过设置一个变量来完成(尽管它应该是使用新的 C++11 原子库之类的原子,或者用互斥锁保护)。如果工人没有在规定的时间内签到,你可以杀死工人,或者以你选择的任何方式处理错误。