2014-03-04 87 views
2

我聽說有些unix實現使用alarm(2)來實現sleep函數。 如果這是真的,我想下面的代碼可能不安全,因爲SIGALRM可能被髮送到進程,這是由根線程接收。在線程中調用sleep(3),usleep(3)或nanosleep(2)是否安全?

#include <pthread.h> 
#include <unistd.h> 

void *doit(void *arg) { 
    sleep(1); 
    return NULL; 
} 

int main(int argc, char *argv[]) { 
    pthread_t th; 

    pthread_create(&th, NULL, doit, NULL); 
    sleep(5); 
    pthread_join(th, NULL); 
    return 0; 
} 

它是安全的調用sleep(3)usleep(3)nanosleep(2)螺紋?

+0

可能的重複[Does calling sleep()from pthre廣告把線程睡覺或進程?](http://stackoverflow.com/questions/6192645/does-calling-sleep-from-pthread-put-thread-to-sleep-or-process) –

+0

你可以閱讀[ posix](http://pubs.opengroup.org/onlinepubs/009695399/functions/sleep.html)不得不說。特別參見「基本原理」部分。 – Duck

回答

0

我不知道在線程中使用sleep()的目的是什麼,但我從不建議其他人這麼做。如果你想測量一定的時間,你可以使用應用程序定時器。例如,如果要控制所有線程的運行順序,則可以使用pthread_cond。 Linux還提供了許多方法來允許您同步線程。

快速查看「man 3 sleep」,它給出以下答案。 「 BUGS sleep()可以使用SIGALRM實現;混合調用alarm(2)和sleep()是一個壞主意 使用信號處理程序中的longjmp(3)或在睡眠時修改SIGALRM的處理會導致未定義的結果

與sleep(3)和usleep(3)相比,nanosleep()具有以下優點:它爲指定睡眠間隔提供了更高的分辨率; POSIX.1明確指定它不與信號;並且它使恢復睡眠的任務更容易被信號處理程序中斷。「

相關問題