1

各要素に 1 つの値を含む単一リンク リストがあります。

struct listElement
{
    char guid[20];
    struct listElement *next;
    struct listElement *last;
    int numElements;
};

このコードはpthread_cond_wait()、要素をリストに追加するためのプール内の 10 個の pthread を起動します。

私の main() は、一度に1行ずつファイルから文字列を読み取り、呼び出してリンクリストを作成していますlistPush(val)

listPush(val)pthread_cond_signal()ロックを取得し、新しい要素を作成し、リストの最後に追加します (空の場合はヘッドを作成します)。ロックを解除し、10 個のスレッドの 1 つに、実行すべき作業のある要素があることを知らせるために呼び出します。

numElements > numThreads の場合はpthread_cond_broadcast()、各スレッドがポップ アンド ゴーするのに十分な作業があるはずなので、呼び出します。

各スレッドlistPop(rVal)は値をオフにして (ロック、削除、ポインタの修正、ロック解除)、それを処理してから状態に戻りpthread_cond_wait()ます。

私のファイルには約2億行あります。(1.2GB) リンク リストをこれほど大きくしたくないので、リンク リストのサイズを「調整」しようとしています。

内部listPush()では、ミューテックスをロックする前に、

if(head && head->numElements >= maxNumElements)
{
    while(head && head->numElements >= maxNumElements)
    {
        sleep(1);
    }
}

アイデアは、リストを「いっぱいにする」場合、スレッドがそのチャンクを処理するのを待ってから追加するというものです。アプリが「パルス」を開始するこのポイントに到達しました。基本的には1秒待って見ることができます。これは決して起こらないか、非常にまれにしか起こらないと思います。

を使用する以外に、リストのサイズを制限するより良い方法はありsleep()ますか?

4

2 に答える 2

0

はい、スリープを使用する代わりに、セマフォを待機し (ミューテックスに似ていますが、別の方法で)、新しい要素がリストに追加されたときに目覚めることができます。イベントライブラリを見つけたり、pthreads を使用して自分で実行したりできる場合があります。

于 2012-06-16T19:28:55.547 に答える
0

これは、典型的な生産者と消費者の問題のように思えます。解決策はlistPush()、リストが大きすぎる場合に条件変数を待機させることです。次に、リスト要素が消費されると、コンシューマ スレッドの 1 つがこの条件変数を通知できます。

完全に異なるアプローチはpipe()、通信と同期の両方を処理するために a を使用することです。これにより、リンクされたリストとミューテックスの両方が不要になります。

于 2012-06-16T19:29:04.573 に答える