2013-02-26 77 views
0

我有結構的數組。每個結構如下。Ç調用pthread_cond_broadcast似乎廣播到所有COND變量

struct thread_st 
{ 
    pthread_t thr; 

    int conn; 
    pthread_mutex_t mutex; 
    pthread_cond_t cond; 
}; 

conn指示線程是否有工作要做。它表示一個任務,如果它是> = 0或等待,如果它是-1。 如果讀取-1它繼續我已經刪除了一點錯誤的處理因此其他等,以縮小塊什麼需要

while (str->conn == -1) { 
    else { 
     if (pthread_cond_wait(&str->cond,&str->mutex)) { 
      if (pthread_mutex_unlock(&str->mutex)) { } 
      return NULL; 
     } 
     printf("here b3\n"); 
    } 
} 

現在擺在等待使用下面的循環用於廣播,我的問題是,當COND變量被廣播 調用pthread_cond_broadcast(& thr-> COND) 其中THR是類型thread_st上述所有線程的打印「在這裏B3」語句。對於理智的緣故,我已經使用 的thread_st陣列在這裏創建測試(再處理去除錯誤)

struct thread_st pool[TP_SIZE]; 
for (i = 0; i < TP_SIZE; i++) { 
    pool[i].conn = -1; 
    if (pthread_mutex_init(&pool[i].mutex,NULL)) { } 
    if (pthread_cond_init(&pool[i].cond,NULL)) { } 
    if (pthread_create(&(pool[i].thr), NULL,worker_thr_routine, pool)) { } 
} 

任何想法?這是我第一次使用cond和mutex變量的真正嘗試,所以如果我是愚蠢的,請告訴!

由於

更新 螺紋只在位於在陣列中的第一結構中的條件變量的廣播響應。

更新2 找到它。這是我成爲一個白癡。我在哪裏叫pthread創建我通過整個池。我只是想通過池[i]

+1

'而(STR->康恩== -1){否則{'顯然不是有效的C代碼。剩下的是什麼? – 2013-02-26 05:09:03

+0

順便說一句,你的成語處理失敗返回看起來有問題... – 2013-02-26 05:10:16

+0

有一個如果有檢查停止標誌。在每一組空括號中都有一個perror和return語句。 我也即將更新帖子,因爲進一步的測試給了我更多的細節 – Hector 2013-02-26 05:14:55

回答

1

您正在將對數組pool的引用傳遞給所有線程,所以(我猜,因爲OP中缺少代碼)每個線程引用數組的第一個元素。

你可能想更改以下行:

if (pthread_create(&(pool[i].thr), NULL,worker_thr_routine, pool)) 

是:

if (pthread_create(&(pool[i].thr), NULL,worker_thr_routine, pool + i)) 

的引用傳遞到當前線程特定的pool壽線程函數的入口。