[英]Reader threads not exiting - Posix Pthreads
我必須使用posix pthreads解決讀者作家的問題,我將代碼壓縮為偽代碼並與C混合以減少代碼的大小。
編寫器線程可以正常運行,但是讀取器線程永不終止/退出,因此, Reader join
將永遠等待,並且程序將掛起。
我相信這與等待條件pthread_cond_wait(&qElement, &mutex);
在閱讀器功能中。 它可能正在等待終止的寫程序線程發出信號。 我嘗試用if(!finished)
對其進行封裝,因此它僅在編寫器仍處於活動狀態但仍不起作用時才等待。
我不確定該怎么做,並認為這是我的pthread處理中的邏輯錯誤。
非常感謝您的幫助。
Global variables in header file :
#define TRUE 1
#define FALSE 0
int finished = FALSE
pthread_cond_t qServiced = PTHREAD_COND_INITIALIZER;
pthread_cond_t qEmpty = PTHREAD_COND_INITIALIZER;
pthread_cond_t qElement = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int main()
{
Create 1 writer thread
Create 2 reader threads
Writer join <- Success
Reader join <- Program hangs here
void* writer()
{
int totalQueued = 0;
int tasks = 20;
while(!finished)
{
pthread_mutex_lock(&mutex);
while(isFull(q))
{
pthread_cond_wait(&qEmpty, &mutex);
}
if(totalQueued < tasks)
{
for(j = 0; j < 2; j++) //Add 2 numbers at a time
{
if(!(isFull(q)))
{
//Assume random numbers added to queue
totalQueued++;
}
}
pthread_cond_signal(&qElement);
pthread_cond_wait(&qServiced, &mutex);
}
else
{
finished = TRUE;
}
pthread_mutex_unlock(&mutex);
}
//Thread exits
}
void* reader()
{
while(!finished)
{
pthread_mutex_lock(&mutex);
while(isEmpty(q)) //If the queue is empty
{
pthread_cond_signal(&qEmpty);
pthread_cond_wait(&qElement, &mutex);
}
int n = dequeue(q);
printf("%d\n", n);
pthread_cond_signal(&qServiced); //Signal that task has been serviced
pthread_mutex_unlock(&mutex);
}
}
您僅提供了代碼草圖,但我無法進行完整的分析,但是即使草圖也顯示出您的方法存在缺陷。 當作者提供新數據時,它將解除對一個讀者的阻塞:
pthread_cond_signal(&qElement);
如果兩個讀者都在等待作者發表最后的作品(可能出現),則當作家終止時,一個讀者將處於等待狀態。
最佳的解決方案圍繞使用pthread_cond_broadcast()
的替代或補充pthread_cond_signal()
最好用后者代替前者,因為您的讀者無論如何都應該保護自己免受偽造的喚醒(看起來確實如此)。 但是,如果願意,可以在寫入器終止之前廣播它,或者在加入寫入器之后廣播主線程。
此外,我傾向於認為您使用的簡歷比實際需要的要多得多。 您很有可能只用一種,這樣寫起來和推論都比較容易。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.