-2

2 つのスレッド間でグローバル動的整数配列を共有するマルチスレッド C プログラムを作成しています。1 つのスレッドが要素を追加し続け、もう 1 つのスレッドが配列を個別にスキャンし、スキャンした要素を解放します。私がやっていることはデッドロックを作成しているので、どうすればそれを行うことができるか教えてもらえますか?

4

3 に答える 3

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 *

于 2012-05-04T11:11:35.613 に答える
1

このような場合、アレイの各操作によって生成される頻度と負荷を確認する必要があります。たとえば、アレイが継続的にスキャンされているが、1 時間に 1 回しか追加されていない場合、読み取りロックの必要性を排除する、非常に低速で遅延の多い書き込みメカニズムを見つける価値があります。このような場合、ミューテックスを使用してすべてのアクセスをロックするのは非常に不十分です。

「スキャン」操作の詳細、特に期間と頻度がなければ、パフォーマンスを向上させるためのスレッド通信戦略を提案することはできません。

わからないもう 1 つのことは、失敗の結果です。新しい追加が実際に挿入される前にしばらくの間キューに入れられても問題ではないかもしれませんし、そうかもしれません。

'Computer Science 101' の回答が必要な場合は、おそらくパフォーマンスが非常に低いため、ミューテックスを使用して配列へのすべてのアクセスをロックします。

于 2012-05-04T12:29:29.867 に答える
0

http://www.liblfds.org

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

WindowsおよびLinux用にそのままコンパイルします。

于 2012-05-04T14:52:19.060 に答える