2014-08-28 57 views
1

我想讓pthreads一次運行多個實例的功能,以提高運行速度和效率。我的代碼應該產生線程,並在隊列中有更多項目時保持打開狀態。然後這些線程應該做'某事'。代碼應該要求「繼續?」當隊列中沒有更多項目時,如果我輸入「yes」,則應將項目添加到隊列中,並且線程應繼續執行「某事」。這是我到目前爲止,問題與pthreads_cond_wait和排隊pthreads

# include <iostream> 
# include <string> 
# include <pthread.h> 
# include <queue> 

using namespace std; 
# define NUM_THREADS 100 

int main (); 
queue<int> testQueue; 
void *checkEmpty(void* arg); 
void *playQueue(void* arg); 
void matrix_exponential_test01 (); 
void matrix_exponential_test02 (); 
pthread_mutex_t queueLock; 
pthread_cond_t queue_cv; 

int main() 
{ 
    pthread_t threads[NUM_THREADS+1]; 
    pthread_mutex_init(&queueLock, NULL); 
    pthread_cond_init (&queue_cv, NULL); 

    for(int i=0; i < NUM_THREADS; i++) 
    { 
     pthread_create(&threads[i], NULL, playQueue, (void*)NULL); 
    } 

    string cont = "yes"; 
    do 
    { 
     cout<<"Continue? "; 
     getline(cin, cont); 
     pthread_mutex_lock (&queueLock); 
     for(int z=0; z<10; z++) 
     { 

      testQueue.push(1); 

     } 
     pthread_mutex_unlock (&queueLock); 
    }while(cont.compare("yes")); 

    pthread_mutex_destroy(&queueLock); 
    pthread_cond_destroy(&queue_cv); 
    pthread_exit(NULL); 
    return 0; 
} 

void* checkEmpty(void* arg) 
{ 
    while(true) 
    { 
     pthread_mutex_lock (&queueLock); 
     if(!testQueue.empty()){ 
      pthread_cond_signal(&queue_cv);} 
     pthread_mutex_unlock (&queueLock); 
    } 
    pthread_exit(NULL); 
} 

void* playQueue(void* arg) 
{ 
    while(true) 
    { 
     pthread_cond_wait(&queue_cv, &queueLock); 
     pthread_mutex_lock (&queueLock); 
     if(!testQueue.empty()) 
     { 
      testQueue.pop(); 
      cout<<testQueue.size()<<endl; 
     } 
     pthread_mutex_unlock (&queueLock); 
    } 
    pthread_exit(NULL); 
} 

所以我的問題在於一個事實,即代碼進入僵局,我不能找出其中的問題發生。我沒有多線程經驗,所以我很容易在這裏犯錯。我也在Windows上運行它。

+2

當'pthread_cond_wait'回報,鎖已被收購。所以你不應該用'pthread_mutex_lock'立即重新鎖定它。 – Brian 2014-08-28 20:58:39

回答

2

你有兩個問題:

  • 條件變量queue_cv從未信號。你可以有隊列推元素後pthread_cond_signal表示它:pthread_cond_signal(&queue_cv);

  • playQueue,試圖從pthread_cond_wait回國後獲得鎖:因爲你的互斥量是不折返,這是不確定的行爲(這是可能的你的死鎖的來源)。只是刪除pthread_mutex_lock (&queueLock);

注:

我不知道什麼是它的真正目的,但checkEmpty()方法不會被調用

+1

謝謝,我懂了! – 2014-09-02 13:01:08

+0

我確實有一個問題,我用1000次試驗進行了測試,結果發現無螺紋版本運行得更快。由於任務是處理數學,我覺得這應該是這種情況。我已經做出了建議的更改,將while循環更改爲1:1000循環,並添加了一個'while(!testQueue.empty()){pthread_cond_signal;}'。爲什麼無螺紋版本比螺紋版本更快?函數中還有很多打印語句。 – 2014-09-02 19:33:01