2017-11-25 4 views
0

スレッド数がx個あり、リストが空でない場合にのみリンクされたリストから要素を削除する必要があります。しかし、私が望むたびに新しい要素を追加するために名前付きパイプを使用しているので、リストが空であればそれらを削除したくありません。私はリンクされたリストが空であるかどうかをチェックしている間に問題に直面しています。もし私のスレッドのすべてが条件を入力し、2つ目のスレッドがプログラムをクラッシュさせる要素があれば。スレッドを使用してリンクリストから要素を削除する

void threads(){ 
    while(1){ 
     if(isEmtpy!=1){ 
      pthread_mutex_lock(&mutex);  
      //work 
      pthread_mutex_unlock(&mutex); 
     } 
    } 
    pthread_exit(NULL); 
} 

私は自分のミューテックスの位置を変更する必要があると思いますが、if条件の前に置くと何も起こりません。同様isEmpty変数を保護するためにロック高く、移動

+0

セマフォを使用して、リスト内の要素を数えます。ループの最上部でそれを待ちます。 'isEmtpy'チェックはまったく必要なく、CPUとメモリ帯域幅がポーリングを無駄にしないようにします。要素をリストに追加するたびに、単位をセマにポストします。 –

+0

要素の数がスレッドの数と同じ場合にのみ要素を削除しますか? – Mike

+0

??それはスレッドがそれらを食べることができるように素早くalementsを削除します。一度に複数の項目が追加され、1つのスレッドだけがリストからそれらの項目をすべて削除するようにしたいのですか?他のスレッドを不必要にアイドル状態にしないでください。たとえば、8つのスレッドがあり、3つのアイテムが追加されている場合は、8つのスレッドのうちの1つで3つのアイテムをすべて削除するか、3つのスレッドを削除するだけですか? –

答えて

0

isEmptyへの変更もクリティカルセクション内で発生する必要があり

void threads(){ 
    while(1){ 
     pthread_mutex_lock(&mutex);  
     if(isEmtpy!=1){ 
      //work 
      isEmpty = hasElements(list) ? 0 : 1; 
     } 
     pthread_mutex_unlock(&mutex); 
    } 
    pthread_exit(NULL); 
} 

十分なはずです。

+0

リストが空であればミューテックスのロックを解除していないので、それは動作していませんでした。ちょうどelseを追加しました。ありがとうございました! – Mike

関連する問題