我有nanosleep()函数的问题。
在测试项目中,它按预期工作 在实际项目中,它不会:就像睡眠时间为零一样。
据我所知,测试和真实项目之间的最大区别是线程数:一个在测试中,两个在真实中。
这可能是原因吗?
如果我把nanosleep调用放在一个线程运行的代码中,那该线程不应该暂停吗?
谢谢。
答案 0 :(得分:1)
这也发生在我身上,问题是我将// C header:
extern "C"
my_class* make_my_class(void);
extern "C"
void dispose_my_class(my_class* p);
// C++ implementation:
extern "C"
my_class* make_my_class(void)
{
return new my_class{ ... };
}
extern "C"
void dispose_my_class(my_class* p)
{
delete p;
}
属性设置为超出timespec.tv_nsec
的值。当您这样做时,值“泄漏”到999999999
属性,并停止正常工作。但是,该功能不会给您任何警告或错误。请确保tv_sec
属性的值低于tv_nsec
的最大值。
答案 1 :(得分:0)
在Linux 3.7 rc5 +上,它确实有效:
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
double time_to_double(struct timeval *t)
{
return t->tv_sec + (t->tv_usec/1000000.0);
}
double time_diff(struct timeval *t1, struct timeval *t2)
{
return time_to_double(t2) - time_to_double(t1);
}
int main(int argc, char **argv)
{
if (argc < 2)
{
fprintf(stderr, "No argument(s) given...\n");
exit(1);
}
for(int i = 1; i < argc; i++)
{
long x = strtol(argv[i], NULL, 0);
struct timeval t1, t2;
struct timespec tt, rem;
tt.tv_sec = x / 10000000000;
tt.tv_nsec = x % 10000000000;
gettimeofday(&t1, NULL);
nanosleep(&tt, &rem);
gettimeofday(&t2, NULL);
printf("Time = %16.11f s\n", time_diff(&t1, &t2));
}
return 0;
}
像这样运行:/a.out 10000 200000 100000000 20000000000
给出:
Time = 0.00007009506 s
Time = 0.00026011467 s
Time = 0.10008978844 s
Time = 2.00009107590 s