線程池簡介

大多數的網絡服務器,包括Web服務器都具備一個特色,就是單位時間內必須處理數目巨大的鏈接請求,可是處理時間倒是比較短的。 在傳統的多線程服務器模型中是這樣實現的:一旦有個請求到達,就建立一個新的線程,由該線程執行任務,任務執行完畢以後,線程就退出。這就是」即時建立,即時銷燬」的策略。 儘管與建立進程相比,建立線程的時間已經大大的縮短,可是若是提交給線程的任務是執行時間較短,並且執行次數很是頻繁,那麼服務器就將處於一個不停的建立線程和銷燬線程的狀態。這筆開銷是不可忽略的,尤爲是線程執行的時間很是很是短的狀況。
假設一個服務器完成一項任務所需時間爲:T1 建立線程時間,T2 在線程中執行任務的時間,T3 銷燬線程時間。若是:T1 + T3 遠大於 T2,則能夠採用線程池,以提升服務器性能。
線程池技術正是關注如何縮短或調整T1,T3時間的技術,從而提升服務器程序性能的。它把T1,T3分別安排在服務器程序的啓動和結束的時間段或者一些空閒的時間段,這樣在服務器程序處理客戶請求時,不會有T1,T3的開銷了。服務器

  線程池實現原理是這樣的:在應用程序啓動以後,就立刻建立必定數量的線程,放入空閒的隊列中。這些線程都是處於阻塞狀態,這些線程只佔一點內存,不佔用CPU。當任務到來後,線程池將選擇一個空閒的線程,將任務傳入此線程中運行。當全部的線程都處在處理任務的時候,線程池將自動建立必定的數量的新線程,用於處理更多的任務。執行任務完成以後線程並不退出,而是繼續在線程池中等待下一次任務。當大部分線程處於阻塞狀態時,線程池將自動銷燬一部分的線程,回收系統資源。網絡

2.函數接口運用步驟:多線程

1,初始化線程池
    bool init_pool(thread_pool *pool, unsigned int threads_number);
2,添加任務
    bool add_task(thread_pool *pool, void *(*do_task)(void *arg), void *task);
3,銷燬線稱池
    bool destroy_pool(thread_pool *pool);

用線程池併發拷貝目錄(目錄和普通文件)
    1.不用線程實現目錄拷貝
    2.用線程實現
    3.用線程池實現
相關文章
相關標籤/搜索