我有nanosleep()函數的問題。nanosleep不能與多線程
在測試項目中,它按預期工作。
在真實的項目中,它並沒有:就像睡眠時間爲零。
據我所知,測試和真實項目之間最大的不同是線程數量:一個在測試中,兩個在真正的測試中。
難道這是原因嗎?
如果我把nanosleep調用放在一個線程運行的代碼中,那該不該線程暫停?
謝謝。
我有nanosleep()函數的問題。nanosleep不能與多線程
在測試項目中,它按預期工作。
在真實的項目中,它並沒有:就像睡眠時間爲零。
據我所知,測試和真實項目之間最大的不同是線程數量:一個在測試中,兩個在真正的測試中。
難道這是原因嗎?
如果我把nanosleep調用放在一個線程運行的代碼中,那該不該線程暫停?
謝謝。
在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
不確定這是什麼意思?測試nanosleep是否存在缺陷?你的測試應用程序甚至不是多線程的?有什麼我失蹤? – thang 2013-02-08 17:59:44
呃,對不起,錯過了多線程的要點...... – 2013-02-08 19:41:58
我們根本不知道自己在做什麼。我不應該很難寫出一小段代碼,人們可以在這裏編譯並親眼目睹您遇到的行爲...... – PlasmaHH 2013-02-08 16:29:45
'nanosleep'應該可以在一個線程中工作。順便說一句,它返回0嗎?如果不是,那麼'errno'值是什麼?它可以被一個信號中斷(給出'errno == EINTR') – 2013-02-08 16:33:01
你是否認爲它可能是一個發佈/調試模式構建? – Caesar 2013-02-08 16:33:10