2012-05-04 8 views
-2

私は、2つのスレッド間でグローバルダイナミック整数配列を共有するマルチスレッドCプログラムを作成しています。 1つのスレッドはそれに要素を追加し続けます&もう1つは独立して配列をスキャンします&スキャンされた要素を解放します。 はいずれも私がやっていることは、デッドロック を作成しているので、またいずれかが、私は、スレッドのために十分な説明マルチスレッドとデッドロック

+6

いいえ、あなたのコードを投稿してください。あなたのコードを修正するのを助けることができます。 – nos

+0

この質問にはそのまま回答することはできません。閉じる。 – usr

+0

私はコードがまだありません、私は分析の途中にありますので、私はPOCも必要です。 –

答えて

1

でそれ用のコードや、このデッドロックを解決する方法を提供することができますことを私が行うことができますどのような方法を提案することができますpthreadを使用します。 -pthreadでコンパイルしてください。ここで

#include <pthread.h> 

int *array; 

// return and argument should be `void *` for pthread 
void *addfunction(void *p) { 
    // add to array 
} 

// same with this thread 
void *scanfunction(void *p) { 
    // scan in array 
} 

int main(void) { 
    // pthread_t variable needed for pthread 
    pthread_t addfunction_t, scanfunction_t; // names are not important but use the same for pthread_create() and pthread_join() 
    // start the threads 
    pthread_create(&addfunction_t, NULL, addfunction, NULL); // the third argument is the function you want to call in this case addfunction() 
    pthread_create(&scanfunction_t, NULL, scanfunction, NULL); // same for scanfunction() 
    // wait until the threads are finish leave out to continue while threads are running 
    pthread_join(addfunction_t, NULL); 
    pthread_join(scanfunction_t, NULL); 
    // code after pthread_join will executed if threads aren't running anymore 
} 

は、pthreadのための良い例/チュートリアルです:このような場合には*klick*

+0

にもこだわっています、より –

+0

その私に何とか助けになるではなく、正確に –

1

、あなたは、アレイ上の各操作によって生成された周波数および負荷で調べる必要があります。たとえば、アレイが連続的にスキャンされているが、1時間に1回しか追加されていない場合は、読み込みロックの必要性を排除する、非常に遅くてレイテンシに敏感な書き込みメカニズムを見つけることができます。このような場合、ミューテックスを使用するすべてのアクセスをロックすることは非常に不十分です。 「スキャン」動作の詳細、特に持続時間と周波数なし

、それは良好なパフォーマンスのためのスレッドコミュニケーション戦略を提案することはできません。

EEは、障害の影響あるかわからない

Anohterのもの - それは可能性のある新しい付加が実際に挿入される前に、しばらくの間、キューに入れられている場合、それは問題ではないかもしれない、または。

あなたは、恐らく、非常に貧弱なパフォーマンスを持つ「コンピュータ・サイエンス101」の答えをしたい場合は、ミューテックスを持つ配列へのすべてのアクセスをロックします。

+0

がで書くために複数のスレッドがありますどのように私はあなたの答えをupvoting午前役立ついくつかをそのグローバル配列を読むことができるスレッドは1つだけであり、このタスクは連続しており、どのスレッドが書き込みを行っているのか、またどのスレッドが読み出しているのかはわかりません。 これを行うには、このや他の方法でこれを完了するために相互排除を使用する必要があります –

+0

これ以上の提案 –

0

http://www.liblfds.org

リリース6はロックフリーキューが含まれています。

は、WindowsおよびLinux用の箱から出してコンパイルします。

関連する問題