0

私のアプリケーションは次のように動作します: ワーカースレッドが初期化され、 pthread_cond_wait() で待機を開始します メインスレッドが DB に接続し、一度に 1 行ずつ適切なワーカーに渡し始めます

DB ドライバーの内部構造により、現在の行が抽出されるまで次の行を読み取ることができないため、メイン スレッドはワーカーが行を「受け入れる」まで待機する必要があります。

これは、メイン スレッド内で pthread_cond_wait() を呼び出すことで実現します。つまり、ワーカーからの pthread_signal() を待ちます。これは、Linux と FreeBSD の両方で問題なく動作しますが、通常、Linux ではさらに時間がかかります。FreeBSD では一貫して約 27 秒で 160 万行全体を処理しますが、Linux では通常 2 分以上かかります。Linuxボックスが同じ時間を表示する場合を除いて...

コードは同じソースからコンパイルされ、プログラムは同じ DB サーバーと通信します。どちらかといえば、Linux ボックスは DB と同じ LAN に配置されていますが、FreeBSD マシンは VPN 経由で接続されています (したがって、少し遅くなるはずです)。しかし、私を悩ませているのは Linux の結果の大きな不一致であり、スレッドの調整を疑っています...

これが私が今持っているものです:

MAIN THREAD                               WORKER
--------------------------------------------------------------------------
get new row
figure out, which worker it belongs to    lock my mutex
lock the worker's mutex                   go into pthread_cond_wait
signal the worker                         extract the row's data
unlock the worker's mutex                 signal the main thread
go into pthread_cond_wait                 unlock the mutex
go on back to getting the next row        go on to process the row's data

より良い方法はありますか?ありがとう!

4

2 に答える 2

0

あなたの問題はpthread_cond_wait()、メインスレッドでロックされたミューテックスなしで呼び出していることです。これは、競合状態があることを意味します。ワーカー スレッドがウェイクアップし、データを抽出して、親が実行される前pthread_cond_wait()に条件を通知すると、ウェイクアップは失われます。

必要なのは、次のような条件変数とペアになった共有状態です。

メインスレッド:

get_new_row();
worker = decide_worker();

pthread_mutex_lock(&mutex);

/* Signal worker that data is available */
flag[worker] = 1;
pthread_cond_signal(&cond);

/* Wait for worker to extract it */
while (flag[worker] == 1)
    pthread_cond_wait(&cond, &mutex):

pthread_mutex_unlock(&mutex);

ワーカー スレッド:

pthread_mutex_lock(&mutex);

/* Wait for data to be available */
while (flag[worker] == 0)
    pthread_cond_wait(&cond, &mutex):

extract_row_data();

/* Signal main thread that extraction is complete */
flag[worker] = 0;
pthread_cond_signal(&cond);

pthread_mutex_unlock(&mutex);
于 2013-01-24T03:07:25.750 に答える
0

とにかく次の行の読み取りがシリアルでなければならない場合、なぜこれをワーカーに委任するのですか? いずれにせよメイン スレッドは待機する必要があるため、メイン スレッドに抽出を行わせ、行が十分に抽出されてマスターが次の行に進むことができるようになったらすぐにハンドオフを発生させます。

それ以外では、コードなしで提出されたこの性質の質問と同様に、説明が不完全であるため、コードを提供する必要があります。

于 2013-01-24T01:16:32.603 に答える