2013-02-08 71 views
-1

我有nanosleep()函數的問題。nanosleep不能與多線程

在測試項目中,它按預期工作。
在真實的項目中,它並沒有:就像睡眠時間爲零。

據我所知,測試和真實項目之間最大的不同是線程數量:一個在測試中,兩個在真正的測試中。

難道這是原因嗎?

如果我把nanosleep調用放在一個線程運行的代碼中,那該不該線程暫停?

謝謝。

+0

我們根本不知道自己在做什麼。我不應該很難寫出一小段代碼,人們可以在這裏編譯並親眼目睹您遇到的行爲...... – PlasmaHH 2013-02-08 16:29:45

+1

'nanosleep'應該可以在一個線程中工作。順便說一句,它返回0嗎?如果不是,那麼'errno'值是什麼?它可以被一個信號中斷(給出'errno == EINTR') – 2013-02-08 16:33:01

+0

你是否認爲它可能是一個發佈/調試模式構建? – Caesar 2013-02-08 16:33:10

回答

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 
+0

不確定這是什麼意思?測試nanosleep是否存在缺陷?你的測試應用程序甚至不是多線程的?有什麼我失蹤? – thang 2013-02-08 17:59:44

+0

呃,對不起,錯過了多線程的要點...... – 2013-02-08 19:41:58