【问题标题】:Stop functions in 5 minutes if they dont end running如果函数没有结束运行,则在 5 分钟内停止函数
【发布时间】:2012-06-25 20:07:38
【问题描述】:

我想在我的项目中添加一个功能。

我有 2 个函数在 for 循环中运行,因为我想在随机数组中找到函数的解。我还有一个生成随机数组的函数。在每个循环中,由 random_array fun 生成的数组是 2 个函数的输入。 2 个函数 在屏幕上打印解决方案 ,它们不返回参数。

int main(){
    for (i=0;i<50 i++)
    {
    arr1=ramdom_array();
    func1(arr1)
    func2(arr1)
    }
}

如果函数在 5 分钟内没有结束,我需要停止运行。 我认为我必须放入类似这样的功能:

void func1(array<array<int,4>,4> initial)
{
while (5minutes_not_passed)
{
//do staff
if(solution==true)
break;
}
}

但我不知道在 5minutes_not_passed 中放什么。

函数的声明如下:

void func1(array<array<int,4>,4> initial)
void func2(array<array<int,4>,4> initial)

我发现我可以使用线程库,但我认为与线程啮合不是一个好主意。我相信需要像计时器这样的东西。 请注意,这些功能有时可能会在 5 分钟之前结束。

【问题讨论】:

  • C++11 有&lt;chrono&gt;,C++03 有&lt;ctime&gt;。根据您是否经常使用计时器,我发现使用&lt;chrono&gt; 使几个计时器类成为一项非常好的活动。他们工作得非常好。

标签: c++ timeout


【解决方案1】:

使用 time_ttime 获取当前秒数。

将 5 * 60 添加到该值。

在循环的每次迭代中,获取时间, 如果大于或等于你的限制,则突破

【讨论】:

  • 这有什么问题? time_t thistime; thistime=time(NULL); thistime=thistime+60*5; while(time(NULL)&lt;thistime) {// do staff for 5 minutes }
【解决方案2】:

我建议在超时的线程中执行您的函数。 这是一个类似问题的链接:

C++: How to implement a timeout for an arbitrary function call?

【讨论】:

    【解决方案3】:

    我知道你说过你不想使用线程,但是 boost::thread 会让这变得非常容易。

    boost::thread t(boost::bind(func1, arr1));
    if(!t1.timed_join(boost::posix_time::minutes(5))){
        // thread still running, use interrupt or detach
    }
    

    【讨论】:

      【解决方案4】:

      或者也许你可以使用类似 kevents (freebsd) 的东西,它有一个计时器通知和信号处理也可以做到这一点。 http://www.linuxquestions.org/questions/programming-9/how-to-use-sigusr1-and-sigusr2-391489/

      因此,在超时后,您需要向您的进程发送一个 SIGUSR1,然后在信号处理函数中,您可以拥有退出的逻辑。

      【讨论】:

      • 哇,说说用氢弹杀死蚂蚁吧!
      • 是的.. :-) 但只要有问题的生物是蚂蚁,而不是蟑螂..氢弹..错误..就可以了! ;-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-28
      • 2023-01-05
      • 1970-01-01
      • 2011-11-23
      • 2014-04-28
      • 1970-01-01
      • 2010-11-24
      相关资源
      最近更新 更多