2012-04-03 90 views
2

我在爲OpenSUSE 12.1開發應用程序。線程 - 同步和睡眠線程拒絕喚醒(LINUX)

此應用程序有一個主線程和其他兩個線程運行相同功能的實例。我試圖用pthread_barrier同步所有的線程,但我有一些問題:

  1. 當我把衍生線程睡覺,他們將永遠不會醒來出於某種原因。
  2. (在我從其他線程中刪除睡眠時,將CPU使用率拋向天空)在某些時間點,所有線程都達到pthread_barrier_wait(),但是之後沒有任何線程繼續執行。

這裏有一些僞代碼試圖說明我在做什麼。

pthread_barrier_t barrier; 
int main(void) 
{ 
    pthread_barrier_init(&barrier, NULL , 3); 
    pthread_create(&thread_id1, NULL,&thread_func, (void*) &params1); 
    pthread_create(&thread_id2v, NULL,&thread_func, (void*) &params2); 

    while(1) 
    { 
     doSomeWork(); 
     nanosleep(&t1, &t2); 

     pthread_barrier_wait(&barrier); 

     doSomeMoreWork(); 
    } 
} 

void *thread_func(void *params) 
{ 
    init_thread(params); 

    while(1) 
    { 
     nanosleep(&t1, &t2); 
     doAnotherWork(); 

     pthread_barrier_wait(&barrier); 
    } 
} 
+3

創建一個可以編譯一個小例子,或張貼真正相關的代碼。僞代碼可能沒有真實代碼所具有的錯誤/錯誤。 – nos 2012-04-03 17:05:51

+0

您是否正確設置了t1變量? – 2012-04-03 17:28:45

+0

是的,它設置正確。 – 2012-04-03 17:42:18

回答

0

我不認爲它與屏障有關,因爲您已經在僞代碼中呈現它。我假設你的glibc與我的機器大致相同。我大致編譯了你的僞代碼,它的運行方式和我預期的一樣:線程做了一些工作,主線程做了一些工作,它們都到達了障礙,然後循環。

你可以評論更多關於任何其他同步方法或工作功能是什麼?

這是我使用的示例程序:

#include <pthread.h> 
#include <stdio.h> 
#include <time.h> 

struct timespec req = {1,0}; //{.tv_sec = 1, .tv_nsec = 0}; 
struct timespec rem = {0,0}; //{.tv_sec = 0, .tv_nsec = 0}; 

pthread_barrier_t barrier; 

void *thread_func(void *params) { 
    long int name; 
    name = (long int)params; 
    while(1) { 
     printf("This is thread %ld\n", name); 
     nanosleep(&req, &rem); 

     pthread_barrier_wait(&barrier); 

     printf("More work from %ld\n", name); 
    } 
} 

int main(void) 
{ 
    pthread_t th1, th2; 

    pthread_barrier_init(&barrier, NULL , 3); 
    pthread_create(&th1, NULL, &thread_func, (void*)1); 
    pthread_create(&th2, NULL, &thread_func, (void*)2); 

    while(1) { 
     nanosleep(&req, &rem); 
     printf("This is the parent\n\n"); 

     pthread_barrier_wait(&barrier); 
    } 
    return 0; 
} 
+0

好吧。我只使用一個互斥鎖來確保我保護了一些數據,但是如果我刪除它,這種行爲不會改變。這項工作真的很大。涉及SHM,一些音頻處理,一些音頻驗證,但就我可以調試它而言,所有這些都沒有關係。我所觀察到的是線程陷入了睡眠,除了主線之外。即使我刪除了障礙,主線程仍會繼續運行,而其他兩個線程永遠不會醒來。 – 2012-04-03 19:40:01

+0

非常感謝您的幫助。 – 2012-04-03 19:41:08

+0

也許我可以給你發送一些源文件,但也許這會讓事情更加混亂。 – 2012-04-03 19:59:12