Проблемы связанного списка с синхронизацией процесса - PullRequest
1 голос
/ 07 мая 2011

Эта программа находится в стадии разработки.Он собирается симулировать мультипроцессор, и я программирую его с синхронизацией производителя-потребителя.

Несколько проблем здесь:

- Мой счетчик pending_request начинается на 1 ниже, чем должен, и уменьшается до -1,Он должен остановиться на 0.

- Моя функция remove_queue также продолжает удалять один.Он будет удаляться до тех пор, пока список не станет пустым, но он не распознает, что список пуст.Затем, если я запускаю remove_queue еще раз, он распознает список пустым.ВЫБОР ОБРАЗЦА НА ДНЕ http://tinyurl.com/3ftytol

#include <stdio.h>
#include <pthread.h>
#include <time.h>
#include <stdlib.h>

typedef struct pr_struct{
        int owner;
        int burst_time;
        struct pr_struct *next_prcmd;
} prcmd_t;
static prcmd_t *pr_head = NULL;
static prcmd_t *pr_tail = NULL;
static int pending_request = 0;
static pthread_mutex_t prmutex = PTHREAD_MUTEX_INITIALIZER;


int add_queue(prcmd_t *node)
{       pthread_mutex_lock(&prmutex);
        //code
        prcmd_t *curNode = pr_head;
        if(pr_head == NULL) { pr_head = node; return;}
        while(curNode->next_prcmd)
        {
              curNode = curNode->next_prcmd;
        }
        curNode->next_prcmd = node;

        //
        pending_request++;
        pthread_mutex_unlock(&prmutex);
        return(0);
}


int remove_queue(prcmd_t **node)
{
    pthread_mutex_lock(&prmutex);

    if(pr_head == NULL)
    {
        //your code
        printf("Queue is empty\n");
        //
        pthread_mutex_unlock(&prmutex);
        return(-1);
    }
    else
    {
        //your code
        prcmd_t *tempNode; tempNode = (prcmd_t*)malloc(sizeof(prcmd_t));
        tempNode = *node;
        *node = tempNode->next_prcmd;
        free(tempNode);
        //
        pending_request--;
        pthread_mutex_unlock(&prmutex);
        return(0);
    }
}


int get_number_request(void)
    { return pending_request; }

void display_list(prcmd_t *node)
{

    if (pr_head == NULL)
    {

        printf("List is empty!\n\n");
    }


    printf("-----------\n");
    while(node)
    {
        printf("%i  %i\n", node->owner,node->burst_time);
        node = node->next_prcmd;
    }
    int r = get_number_request();
    printf("Pending requests: %i\n", r);
}


int main()
{

    int i=0;
    int length = 4;
    prcmd_t *pr[length];
    for(i =0;i<length;i++)
    {
        pr[i] = (prcmd_t*)malloc(sizeof(prcmd_t));
        pr[i]->owner = i+1;
        pr[i]->burst_time = i + 2;
        add_queue(pr[i]);
    }


    display_list(pr_head);  

    remove_queue(&pr_head);
    display_list(pr_head);
    remove_queue(&pr_head);
    display_list(pr_head);
    remove_queue(&pr_head);
    display_list(pr_head);
    remove_queue(&pr_head);
    display_list(pr_head);
    remove_queue(&pr_head);
    display_list(pr_head);

}

1 Ответ

1 голос
/ 07 мая 2011

некоторые вещи (хотя, может быть, не все):

Нет необходимости в указателе хвоста, если список не связан дважды, потому что нет способа перейти от хвоста к голове (без предыдущего указателя)

Почему вы malloc в своей очереди на удаление?

*node = prHead;
prHead = prHead->next_prcmd;
--pending_request;

в add_queue вы должны node->next_prcmd = NULL;, иначе вы никогда не узнаете конец.

снова, некоторые вещи, но, возможно, не все ...

Марио

...