2016-12-19 3 views
2

Мне нужно сделать три потока с общим доступом к связанному списку: поиск, добавление, удаление потока. Прослеживание потока только в списке. Добавление потоков добавляет элемент в конце списка, и они взаимно исключают (защищены мьютексом), но вы можете искать и добавлять одновременно. Удаление потоков удаляет элемент из любой точки в списке, и они являются эксклюзивными с добавлением и поиском.MultiThreading with 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; 
} 

Если кто-то может показать мне путь, как это сделать с потоками и мьютекса я буду очень благодарен

+0

У вас уже есть код для трех функций. Попробуйте поместить их в поток. Используйте мьютекс для защиты критических разделов. – Jerry

+0

Заметка, как поиск возвращает что-нибудь? Это пустота. –

+0

Вы испортили название своего списка. В одной функции вы используете 'start', в то время как в других вы используете' head'. Возможно, вы не должны использовать глобальные переменные для своего списка вообще. – Gerhardh

ответ

2

Предполагая, что вы используете pthread.h.

Сначала вы должны добавить-структуру для вас связанный список:

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

А затем добавить pthread_mutex_lock(&list_mutex); в начале каждой функции и pthread_mutex_unlock(&list_mutex); до конца.

Также ваши функции должны получать список в качестве аргумента, поэтому вам необходимо изменить определения функций.

Вы должны прочитать о замках мьютекса Pthread.

+0

Это называется крупнозернистой фиксацией зерна, и это основа всех методов. Если вы хотите заблокировать весь список для каждой операции, то зачем использовать несколько потоков? Другие методы - блокировка мелкого зерна, оптимизированная синхронизация, ленивая синхронизация, не блокирование ... e.t.c –

+1

Замок, который я объяснил, является самым простым по заданным правилам. Я понимаю, что я дал наихудший способ блокировки, но без каких-либо конкретных предположений (таких как вероятность конфликта и т. Д.) Это кажется самым простым способом. –