【问题标题】:MultiThreading with LinkedList使用 LinkedList 进行多线程
【发布时间】:2016-12-19 10:46:22
【问题描述】:

我需要创建三个具有对linkedlist 的共享访问权限的线程:搜索、添加、删除线程。搜索线程仅浏览列表。添加线程在列表末尾添加项目,它们是互斥的(受互斥锁保护),但您可以同时搜索和添加。删除线程从列表中的任何点删除项目,它们与添加和搜索互斥。

我的链表:

      struct node
        {
            int data;
            struct node *next;
        }

       void search(int num)
        {
        int flag = 0;
        struct node *temp;

        temp = start;

          while(temp!=NULL)
          {
            if(temp->data == num)
               return(temp); //Found
            temp = temp->next;
          }

          if(flag == 0)
             return(start); // Not found
        }

        void insert(int num)
        {
            int c=0;
            struct node *temp;
            temp=head;
            if(temp==NULL)
            {
            add(num);
            }
            else
            {
            while(temp!=NULL)
            {
                if(temp->data<num)
                c++;
                temp=temp->next;
            }
            if(c==0)
                add(num);
            else if(c<count())
                addafter(num,++c);
            else
                append(num);
            }
        }

int delete(int num)
{
    struct node *temp, *prev;
    temp=head;
    while(temp!=NULL)
    {
    if(temp->data==num)
    {
        if(temp==head)
        {
        head=temp->next;
        free(temp);
        return 1;
        }
        else
        {
        prev->next=temp->next;
        free(temp);
        return 1;
        }
    }
    else
    {
        prev=temp;
        temp= temp->next;
    }
    }
    return 0;
}

如果有人能告诉我如何处理线程和互斥锁,我将非常感激

【问题讨论】:

  • 你已经有了这三个函数的代码。尝试将每个都放在一个线程上。使用互斥锁保护关键部分。
  • 注意,搜索如何返回任何内容?这是一个空白。
  • 你搞砸了你的列表名称。在一个函数中使用start,而在其他函数中使用head。也许您根本不应该在列表中使用全局变量。
  • 你的搜索功能也坏了。您无法区分在第一个节点中找到您的价值和根本没有找到它。您应该返回 NULL 而不是 start,当然函数签名必须从 void 更改为 struct node* 作为返回类型。
  • 有几种方法可以做到这一点。请参阅此链接中的信息cs.nyu.edu/courses/fall05/G22.2631-001/lists.slides2.pdf它是在java中,但原理是相同的

标签: c multithreading linked-list


【解决方案1】:

假设您使用的是 pthread.h。

首先你应该为你的链表添加一个结构:

typedef struct 
        {
            struct node *first;
            pthread_mutex_t list_mutex;
        } *List;

然后在每个函数的开头添加pthread_mutex_lock(&amp;list_mutex);,在末尾添加pthread_mutex_unlock(&amp;list_mutex);

您的函数也应该接收一个 List 作为参数,因此您需要更改函数定义。

您应该阅读有关 Pthread 互斥锁的信息。

【讨论】:

  • 这称为粗粒度锁定,它是所有方法的基础。如果要为每个操作锁定整个列表,那么为什么要使用多个线程?其他方法是细粒度锁定、乐观同步、惰性同步、非阻塞......等等
  • 我解释的锁在给定规则下是最简单的。我知道我给出了最糟糕的锁定方式,但没有任何给定的假设(例如冲突概率等),这似乎是最简单的方式。
猜你喜欢
  • 2023-03-12
  • 2015-09-26
  • 1970-01-01
  • 2016-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多