2010-08-20 53 views
0

我必須調用單獨線程中的一個方法(我正在使用posix線程),它會在每5秒後更新一些值,其中寫下面的代碼。問題在暫停posix線程在特定的時間間隔c

void *threadEntry(void *) 
{ 
    while(1) 
    { 
    updateValue();//to update some values 
    usleep(5000000);//pause for 5 second 
    } 
} 
pthread_t thread1; 
pthread_create(&thread1,NULL,threadEntry,NULL); 

但這線程獲取分段錯誤4-5分鐘後。什麼能原因是什麼?是否有任何其他方式暫停POSIX線程。(我使用的Linux)

+2

你可以添加崩潰的回溯到你的問題 – 2010-08-20 09:02:09

+0

是時間問題還是與段錯誤?你能澄清這一點嗎?例如,刪除睡眠並不斷調用updateValue會導致段錯誤。 – shodanex 2010-08-20 11:56:36

+1

崩潰更可能出現在您顯示的線程函數中的updateValue()函數中。 – 2010-08-20 13:43:14

回答

1

的正確的事是使用了nanosleep,因爲usleep和睡眠可以亂用SIGALARM,同時了nanosleep是專門用螺紋設計考慮:

struct timespec mytimeout = { 
    .tv_sec = 5, 
    .tv_usec = 0, 
}; 
struct timespec remaining; 
nanosleep(&mytimeout, &remaining); 

我原來的答案是使用一個選擇技巧,但是讓我們停止推廣糟糕的代碼

回到問題的根源,您如何知道您的分段錯誤來自睡眠代碼? 你有沒有得到一個可以回溯的核心轉儲?

+0

很久以前,我沒有看到這種黑客。不,不要那樣做,使用'nanosleep'。 – 2010-08-20 12:28:56

+0

你是該死的 – shodanex 2010-08-20 13:24:09

+0

還要注意''nanosleep()'可能會在指定的時間之前返回,'errno'設置爲'EINTR'。如果這不行,需要在設置'mytimeout = remaining'(循環)後繼續納睡。 – FooF 2013-07-17 13:42:40

1

在POSIX系統(其中linux是)nanosleep是這樣睡眠正確的事情:

int nanosleep(const struct timespec *req, struct timespec *rem); 

其中req是您的請求rem是剩餘的,如果你的線程被過早中斷時間睡覺。