同時スレッドの数に制限を設ける場合、最善の策は、前もってすべてのスレッド (ワーカー) を頻繁に作成し、それらを無限ループで実行させ、キューで作業を待機させることです。
次に、メイン スレッドは、ワーカーが処理するための作業項目 (この場合は接続) をそのキューに追加する役割を果たします。
これの利点は、単純さと速度です。スレッドの開始または停止について 1 回を除いて心配する必要がないため、シンプルです。スレッドは常に実行されており、作業項目にサービスを提供しています。
同じ理由でスピード。これは、固定サイズのスレッド プールのようなものです。また、ワークアイテムを最も効率的な方法で処理します (スレッドが前のアイテムを終了したときにのみ新しいアイテムを要求するため、ワークロードは自動的にバランスが取れます)。
擬似コードでは、これは次のようになります。メインラインは、作業項目が入ってくるとキューに追加するだけです。すべてが完了すると、各スレッドに特別な仕上げ作業項目をポストして、すべてが完了するのを待ちます。
def queue workqueue = empty
def main:
# start the threads
create threadId[5]
for each threadId (i):
threadId[i] = startThread (worker)
# main work loop, finished with (for example) external signal.
while not finished:
get workitem from some source
add workitem to workqueue
# Place one special FINISH work item for each thread.
for each threadId (i):
add FINISH item to workqueue
# Wait for all threads to exit, then exit main.
for each threadId (i):
wait for threadId[i] to exit
exit
ワーカー スレッドも同様に単純です。必要に応じて作業項目を取得して処理するための無限ループ。
作業項目が仕上げの場合、終了し、各スレッドが 1 つの仕上げ作業項目のみを取得することが保証されます。
def worker:
# Simple infinite loop to get work items.
while true:
get workitem from workqueue
# Exit if told to.
if workitem is a FINISH item:
break
# Otherwise, process the item and loop around to request next.
process workitem
exit