簡體   English   中英

閱讀器線程未退出-Posix Pthreads

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM