如果你把一個限制併發線程數,最好的辦法是經常上創建所有線程(工)前面,讓他們在一個無限循環運行,等待工作一個隊列。
然後,主線程負責將工作項目(本例中的連接)添加到該隊列以供工作人員處理。
這個的優點是簡單和速度。簡單,因爲您不必擔心線程開始或停止,除非一次,它們始終運行併爲工作項目提供服務。
速度出於同樣的原因。這就像一個固定大小的線程池。它也以最有效的方式處理工作項目(工作量自動平衡,因爲線程只會在完成前一個項目時纔會要求新項目)。
在僞代碼中,這將如下所示。主線只需將工作項添加到隊列中即可。完成所有工作後,它可以爲每個線程發佈特殊的完成工作項,然後等待它們全部完成。
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
工作線程同樣很簡單。無限循環根據需要獲取工作項並處理它們。
如果工作項目是一個結束,退出,保證每個線程有且只有一個整理工作項目:
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
您是否考慮過在您的套接字上使用非阻塞I/O(可能使用poll,epoll或select)並且只針對所有連接使用單線程?用這種方法肯定可以擴展到5個以上 - 並不難。 – selbie 2012-08-06 02:18:12