-1

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

如何使用 bind 和 timed_join ?

4

3 回答 3

3

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

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

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

于 2012-06-29T00:13:46.407 回答
2

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

void foo(void)
{
    time_t end = time(NULL) + 60;
    while (time(NULL) <= end)
    {
        … // do something
    }
}
于 2012-06-29T00:15:58.103 回答
0

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

POSIX pthreadAPI 支持取消,但标准不保证立即取消。但下面是一个示例,说明它如何用于foo在 1 秒后取消功能,而它通常会运行 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));
于 2012-06-29T06:34:22.527 回答