流程同步的链接列表问题

时间:2011-05-07 05:54:02

标签: c synchronization linked-list

此计划正在进行中。它将模拟一个多处理器,我正在使用生产者 - 消费者同步对其进行编程。

这里几乎没有问题:

- 我的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 个答案:

答案 0 :(得分:1)

有些事情(尽管可能不是全部):

如果列表没有双重链接,则不需要尾部指针,因为没有办法从尾部到头部(没有先前的指针)

为什么要在删除队列中使用malloc?

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

在add_queue中你必须node->next_prcmd = NULL;,否则你永远不会知道结尾。

再次,有些事情,但可能不是全部......

马里奥