如何让函数foo()运行一段时间?我认为线程是最常见的强制方式。
如何使用bind和timed_join ??
答案 0 :(得分:3)
代码与其他代码没有争执。代码合作完成工作。如果您只想让foo
运行一分钟,请将其编码为仅运行一分钟。不要以其他方式编写代码,然后尝试强制它以某种方式工作,而不是编码方式。
如果要使用线程,可以编写foo
代码来检查同步的“中止”标志。如果foo
注意到该标志已设置,则会中止。然后,一分钟后,从另一个线程设置该标志。然后foo
会注意到标志已设置并自行中止。
如果您需要中止阻止I / O操作等内容,则解决方案是特定于平台的。或者,您可以使用提供此类功能的可移植库,例如Boost。
答案 1 :(得分:2)
我不确定你在问什么。如果你只需要一个函数来做一分钟的事情,你可以将它包装在while循环中吗?
void foo(void)
{
time_t end = time(NULL) + 60;
while (time(NULL) <= end)
{
… // do something
}
}
答案 2 :(得分:0)
如何使函数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::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));