c - 进程同步的链表问题



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

这里有几个问题:

-

我的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 emptyn");
        //
        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!nn");
    }

    printf("-----------n");
    while(node)
    {
        printf("%i  %in", node->owner,node->burst_time);
        node = node->next_prcmd;
    }
    int r = get_number_request();
    printf("Pending requests: %in", 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);
}

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

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

为什么在删除队列中 malloc?

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

在add_queue你必须node->next_prcmd = NULL;其他的Wwise,你永远不会知道结局。

同样,有些事情,但也许不是全部...

马里奥

相关内容

  • 没有找到相关文章

最新更新