【问题标题】:How do I make a function run for only one minute如何让一个函数只运行一分钟
【发布时间】:2012-06-30 13:26:11
【问题描述】:

如何让函数 foo() 只运行一段时间?我认为线程是最常见的实现方式。

如何使用 bind 和 timed_join ??

【问题讨论】:

标签: c++ time


【解决方案1】:

如何让函数 foo() 只运行一段时间?

POSIX pthread API 支持取消,但标准不保证立即取消。但下面是一个说明如何使用它在 1 秒后取消功能 foo,而它通常会运行 5 秒。

void foo ()
{
    sleep(5);
}

void * start_foo (void *)
{
    int x;
    pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &x);
    foo();
    return 0;
}

    pthread_t t;
    pthread_create(&t, 0, start_foo, 0);
    sleep(1);
    pthread_cancel(t);
    pthread_join(t, 0);

start_foo 函数启用取消状态。 x 参数接收旧的取消状态。

如何使用 bind 和 timed_join ??

我相信您指的是boost::bindboost::thread::timed_joinboost::bind 提供了一种机制来定义一个不接受任何参数的仿函数,但调用一个传递参数的函数。 boost::thread 需要一个不带参数的函子,这就是它在那里使用的原因。

boost::thread t(boost::bind(puts, "hello, world"));

boost::thread::timed_joinboost::thread 上的一个连接,如果线程在传递给它的时间参数内未完成,则可能返回 false。

boost::thread t(foo);
t.timed_join(boost::posix_time::seconds(1));

【讨论】:

    【解决方案2】:

    我不完全确定你在问什么。如果你只需要一个函数来做一分钟的事情,你可以把它包装在一个while循环中吗?

    void foo(void)
    {
        time_t end = time(NULL) + 60;
        while (time(NULL) <= end)
        {
            … // do something
        }
    }
    

    【讨论】:

    • 如果 //do something 语句运行 20 分钟,您的代码将运行 20 分钟。我需要每秒检查一次我的代码,所以当 60 秒过去时,它会脱离语句。你明白吗?
    • @georgemano :然后将时间检查也放在//do something 中。你的问题太模糊了,无法具体回答。
    • @georgemano 我不知道该说什么,如果您编写的代码从不循环并运行 20 分钟,那么您遇到的问题比我曾经处理过的要多得多和。我见过的所有长时间运行的代码本质上都是循环的(网络循环、操作循环、动画循环、命令循环……)。抱歉,我的建议没有太大帮助。
    【解决方案3】:

    代码不会与其他代码发生冲突。代码合作完成工作。如果您只希望foo 运行一分钟,请将其编码为仅运行一分钟。不要以其他方式对其进行编码,然后尝试强制它以不同于其编码方式的方式工作。

    如果你想使用线程,你可以编码foo 来检查同步的“中止”标志。如果foo 注意到该标志已设置,它将中止。然后,一分钟后,从另一个线程设置该标志。然后foo 会注意到标志已设置并自行中止。

    如果您需要中止诸如阻塞 I/O 操作之类的事情,则解决方案是特定于平台的。或者您可以使用提供此类功能的可移植库,例如Boost

    【讨论】:

    • 从这个角度来看,一些线程 API 已经“试验”了控制线程可以用来强制取消另一个线程的命令 - 它表面上很吸引人,但实际上被取消的线程很容易最终有一些资源(堆、锁、文件描述符)将永远不会被释放/解锁/关闭等。许多系统和库调用会暂时占用这些资源,因此这不仅仅是扫描您自己的源代码的问题。只有在非常有限的情况下,比如密集的数学计算,它才是真正安全的。现在很少有 API 取消了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    相关资源
    最近更新 更多