2016-12-19 2 views
2

linkedlistへの共有アクセスを持つスレッドを3つ作成する必要があります。検索、追加、スレッドの削除です。リストを介してブラウズのみをスレッドにする。スレッドを追加すると、リストの最後に項目が追加され、それらは相互排他的(mutexによって保護されています)ですが、同時に検索したり追加したりすることができます。スレッドを削除すると、リストの任意のポイントからアイテムが削除され、追加と検索でmutal排他的になります。LinkedListを使用したMultiThreading

マイリンクリスト:

 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; 
} 

誰もが道どのようにスレッドと私はあなたがpthread.hのを使用していると仮定すると、

+0

すでに3つの機能のコードがあります。それぞれをスレッドに入れてみてください。クリティカルセクションを保護するには、mutexを使用します。 – Jerry

+0

注記、検索は何を返すのですか?それは無効です。 –

+0

あなたはあなたのリスト名を混乱させました。ある関数では 'start'を使いますが、他の関数では' head'を使います。たぶんあなたのリストにグローバル変数を使用しないでください。 – Gerhardh

答えて

2

とても感謝してますミューテックスをどうする私を見ることができれば。

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

をそして最後に、各機能の開始とpthread_mutex_unlock(&list_mutex);pthread_mutex_lock(&list_mutex);を追加します。

まず、あなたがリストをリンクするために構造体を追加する必要があります。

また、関数は引数としてListを受け取る必要があるため、関数定義を変更する必要があります。

Pthreadのミューテックスロックについてお読みください。

+0

これは粗粒度ロックと呼ばれ、それはすべての方法の基盤です。各操作のリスト全体をロックする場合は、なぜ複数のスレッドを使用するのですか?他の方法は、細かい粒状のロック、楽観的な同期、遅延同期、非ブロッキングです... e.t.c –

+1

私が説明したロックは、与えられたルールの下で最も簡単です。私はロックの最悪の方法を与えたと理解していますが、何らかの前提条件(矛盾の可能性など)がなくても、これは最も簡単な方法のようです。 –