你如何让函数 foo() 只运行一段时间?我认为线程是最常见的实现方式。
如何使用 bind 和 timed_join ?
代码不会与其他代码发生冲突。代码合作完成工作。如果您只想foo
运行一分钟,请将其编码为仅运行一分钟。不要以其他方式对其进行编码,然后尝试强制它以不同于其编码方式的方式工作。
如果您想使用线程,您可以编写代码foo
来检查同步的“中止”标志。如果foo
注意到标志被设置,它会中止。然后,一分钟后,从另一个线程设置该标志。然后foo
会注意到标志已设置并自行中止。
如果您需要中止诸如阻塞 I/O 操作之类的事情,则解决方案是特定于平台的。或者,您可以使用提供此类功能的可移植库,例如Boost。
我不确定你在问什么。如果你只需要一个函数来做一分钟的事情,你能把它包装在一个while循环中吗?
void foo(void)
{
time_t end = time(NULL) + 60;
while (time(NULL) <= end)
{
… // do something
}
}
你如何让函数 foo() 只运行一段时间?
POSIX pthread
API 支持取消,但标准不保证立即取消。但下面是一个示例,说明它如何用于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::bind
和boost::thread::timed_join
。boost::bind
提供了一种机制来定义一个不接受任何参数的仿函数,但调用一个传递参数的函数。boost::thread
需要一个不带参数的函子,所以这就是它在那里使用的原因。
boost::thread t(boost::bind(puts, "hello, world"));
boost::thread::timed_join
boost::thread
如果线程在传递给它的时间参数内未完成,则可能返回 false 的连接。
boost::thread t(foo);
t.timed_join(boost::posix_time::seconds(1));