ラインプールのアプリケーション起源
複数のクライアントができます満たすために同時に着陸の要件を、サーバが同時作業を実装する必要があります。サーバーのメインプロセスがクライアント接続を待機し続ける場合は、クライアント上の各接続が必要クライアントタスクを処理する別のプロセスまたはスレッドを。しかし、複数のプロセスを考慮すると、システムリソースの消費量を、繰り返し作成し、破棄単一のスレッドがあり、そのような行動過度のスケジューリングオーバーヘッドので、リニア・プールの使用が。
リニアプールは、マルチスレッドで同時処理形態、それが作成されたスレッドの良い束です。新しいタスクを考える- >アイドル状態のスレッドの処理タスクを削除 - > [タスク処理を待つために、スレッドプールに完成されています。同時タスクの数が多い連続生産のために非常に適し、破壊のコスト、短期的なタスクを扱うスレッドを作成するために、繰り返しの多くを避けてください。
Wireラインプールの実装プロセスの原則:
1 )初期設定タスクキューバッファ機構として(リスト)、および初期化作成 n個のスレッドを、ロッキングタスクキュータスク実行(マルチスレッドミューテックス)を取ります。
2 )では、処理タスク処理と、ジョブキューが空である、すべてのスレッドがブロックされ(ブロックIOが)であるアイドル(待機)状態。
3 )タスクキューは、参加する場合は、新規タスクキューのロックをした後、使用条件変数のウェイクアップ(作業をするためのスレッドのブロックで)タスクを実行します。
4 )後者の実装は、再びスレッドプールがアイドル状態になるに戻る(待機)状態、順次又は待つ次のタスク。
最後に、すべての作業を完了しますプールスレッドでスレッドを破壊団結。
加盟プロセスのフレームワーク:
メイン主な機能: // 1.初期化スレッドプール もしpool_init(5 ); //は、 接続を待つ しばらく(1 ) { new_fd =(数sockfd、(受け入れ構造体のsockaddr *)(&CLIENT_ADDR)を、&sin_size); // 2.実行プロセス、スレッドプール処理するタスク pool_add_task(プロセス、new_fdを); } ボイドもしpool_init(INT max_thread_num) { プール - >のThreadID =(がpthread_t *)はmalloc(* max_thread_num はsizeof(がpthread_t)); // アプリケーション・スタック領域 のための( = I 0 ; I <max_thread_num; I ++)//3 { のpthread_create( &(プール|>スレッドID [i])と、NULL、thread_routine、NULL); // 创建线程保存线程ID } } int型pool_add_task(ボイド*(*プロセス)(INT引数)、INT のarg) { / * 构造一个新任务初始化* / Cthread_task *タスク=(Cthread_task *)はmalloc(はsizeof (Cthread_task) ); タスク - >プロセス=プロセス。 task->引数= argを。 タスク - >次= NULL; pthread_mutex_lockの(&(プール|> queue_lock)); ~~~~~~ pthread_mutex_unlockの(&(プール|> queue_lock))。 pthread_cond_signalを(・(プール|> queue_ready)); // ウェイクアップスレッド 戻り 0 ; } void *型プロセス(INTのArg)//読み取るオペレータは、対応するコマンド応答を読み取り