2015-07-05 37 views
0

我正在學習Pthread編程。這是我在作業結束時得到的問題:

我想通過使用producer-consumer問題將源文件中的每個字節複製到新的.txt文件中。
這裏是我的代碼結構:生產者 - 消費者模型的最終條件

void *producer(....) { 
    while(1){ 
     nsleep(); 
     read_byte(....); 
     nsleep(); 
     produceToBuffer(....); 
    } 
} 
void *consumer(....) { 
    while(1){ 
     nsleep(); 
     consumeFromBuffer(....); 
     nsleep(); 
     write_byte(....); 
    } 
} 


int main() { 
     pthread_t inThread[nIn]; 
     pthread_t outThread[nOut]; 

     //initialize mutex locks for all functions 
     pthread_mutex_init(&_mutexConsume, NULL); 
     pthread_mutex_init(&_mutexProduce, NULL); 
     pthread_mutex_init(&_mutexWrite, NULL); 
     pthread_mutex_init(&_mutexRead, NULL); 


     sem_init(&empty, 0, size); //initialize semaphore signal the empty slots available 
     sem_init(&full, 0, 0);  //initialize semaphore full signal 

     for(i = 0; i < nIn; i++) { 
      pthread_create(inThread+i, NULL, producer, null); 

     } 

     for(j = 0; j < nOut; j++) { 
      pthread_create(outThread+i, NULL, consumer, null); 

     } 
} 


我的問題是:在文件的結尾,這是pthread_exit(0);當EOF檢測,但對於消費者線程,我的想法是生產者線程完成要麼在睡眠後完成,要麼在所有消費者線程都在等待信號量滿時結束。
有人可以幫助我嗎?

+1

我不知道我理解你的題。你所展示的不可編譯的半僞代碼會讓情況變得更糟。你不知道如何告訴消費者輸入結束了?一種可能的方法是通過在緩衝隊列中插入一個特殊值來指示這一點。 –

回答

1

是否有理由在生產者離開後保持消費者線程活躍?

如果沒有,您可以發信號通知消費者線程沒有更多生產者線程並將其用作終止信號,以便您的主線程等待所有生產者線程。

您可以使用pthread_join(producer_thread_id)等待生產者線程完成,並且一旦所有生產者線程完成,對每個消費者線程使用pthread_cancel(consumer_thread_id)來終止其執行。

,需要在每個thread_id保存到一個數組,當您使用pthread_create,所以你可以將它們用於pthread_cancelpthread_join

你可以閱讀有關pthread_joinherepthread_cancelhere

+0

對於我的第二個想法,我的想法是在生產函數,sem_post(&semaphore)和消費者函數sem_wait(&semaphore)中初始化一個帶有生產者線程數值的信號量;主要是檢查信號量是否爲0,這意味着沒有更多的生產者正在生產緩衝項目。 –

+0

不知道我完全理解 - 如果您在生產者中使用sem_post和使用者中使用sem_wait,並且您的消費者少於生產者,則這不起作用。即使您擁有相同數量的消費者和生產者,也不會工作,因爲信號量始終爲0 –