各要素に 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()
ますか?