【发布时间】:2012-02-06 08:09:58
【问题描述】:
我正在分析在多个处理器上运行的并行算法。
但它是一个简单的,所以我需要模拟一个长时间运行的操作来分析有效的加速。
sleep()/usleep() 不是一个选项。我需要保持 CPU 忙碌,以便从属程序在其他从属睡眠时无法工作。这里的加速不正确。
长空 for 循环是一个选项。但我也想明确设置操作时间。
有没有办法将这两者结合起来或使用其他东西来获得时间固定的长时间操作?
【问题讨论】:
我正在分析在多个处理器上运行的并行算法。
但它是一个简单的,所以我需要模拟一个长时间运行的操作来分析有效的加速。
sleep()/usleep() 不是一个选项。我需要保持 CPU 忙碌,以便从属程序在其他从属睡眠时无法工作。这里的加速不正确。
长空 for 循环是一个选项。但我也想明确设置操作时间。
有没有办法将这两者结合起来或使用其他东西来获得时间固定的长时间操作?
【问题讨论】:
在进入循环之前拨打gettimeofday并记住时间。在循环内,连续调用gettimeofday,计算当前时间与开始时间的差值。当差异足够大时,跳出循环。
本质上是这样的:
struct timeval tv_begin, tv_current;
gettimeofday(&tv_begin, NULL);
for (;;) {
gettimeofday(&tv_current, NULL);
unsigned long long diff =
(tv_current.tv_sec * 1000000 + tv_current.tv_usec) -
(tv_begin.tv_sec * 1000000 + tv_begin.tv_usec);
if (diff > TIMEOUT)
break;
}
【讨论】:
getitimer()/setitimer()。设置计时器,让 SIGALRM 的信号处理程序设置一个开关,让你跳出循环。循环做它做的事情——或者什么都不做——直到计时器结束。
【讨论】: