1

有人可以给我看一个使用 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


}
4

2 回答 2

3

要实现这一点,您只需要:

  1. 使用获取“unit_test_monitor”的句柄auto& inst = boost::test::unit_test_monitor::instance()
  2. 使用设置预期的超时值inst.p_timeout.set( num_seconds );
  3. 通过执行监视器的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 ) );
}
于 2012-12-04T08:05:58.110 回答
1

您不一定需要 Boost 来执行此操作。实现超时的一种非常简单且常用的技术是看门狗定时器。本质上,工作线程或进程定期与管理器线程“签入”。这可以简单地通过设置一个变量来完成(尽管它应该是使用新的 C++11 原子库之类的原子,或者用互斥锁保护)。如果工人没有在规定的时间内签到,你可以杀死工人,或者以你选择的任何方式处理错误。

于 2012-12-03T20:00:45.473 回答