歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Linux 下C語言簡單實現線程池

0 前言

網上關於線程池的例子還是不少,簡單明了的倒是比較少,看了網上的資料,打算借鑒網上的一些例子,自己實現以下。

線程的概念就不多說,首先說一下多線程的好處:多線程技術主要解決處理器單元內多個線程執行的問題,它可以顯著減少處理器單元的閒置時間,增加處理器單元的吞吐能力。

那麼為什麼又需要線程池呢?

我們知道應用程序創建一個對象,然後銷毀對象是很耗費資源的。創建線程,銷毀線程,也是如此。因此,我們就預先生成一些線程,等到我們使用的時候在進行調度,於是,一些"池化資源"技術就這樣的產生了。

1 線程池優點

下面使用網上資源驗證線程池如何提高服務器性能的。

我所提到服務器程序是指能夠接受客戶請求並能處理請求的程序,而不只是指那些接受網絡客戶請求的網絡服務器程序。

多線程技術主要解決處理器單元內多個線程執行的問題,它可以顯著減少處理器單元的閒置時間,增加處理器單元的吞吐能力。但如果對多線程應用不當,會增加對單個任務的處理時間。可以舉一個簡單的例子:

假設在一台服務器完成一項任務的時間為T

T1 創建線程的時間

T2 在線程中執行任務的時間,包括線程間同步所需時間

T3 線程銷毀的時間

顯然T = T1+T2+T3。注意這是一個極度簡化的假設。

可以看出T1,T3是多線程本身的帶來的開銷,我們渴望減少T1,T3所用的時間,從而減少T的時間。但一些線程的使用者並沒有注意到這一點,所以在程序中頻繁的創建或銷毀線程,這導致T1和T3在T中占有相當比例。顯然這是突出了線程的弱點(T1,T3),而不是優點(並發性)。

線程池技術正是關注如何縮短或調整T1,T3時間的技術,從而提高服務器程序性能的。它把T1,T3分別安排在服務器程序的啟動和結束的時間段或者一些空閒的時間段,這樣在服務器程序處理客戶請求時,不會有T1,T3的開銷了。

線程池不僅調整T1,T3產生的時間段,而且它還顯著減少了創建線程的數目。在看一個例子:

假設一個服務器一天要處理50000個請求,並且每個請求需要一個單獨的線程完成。我們比較利用線程池技術和不利於線程池技術的服務器處理這些請求時所產生的線程總數。在線程池中,線程數一般是固定的,所以產生線程總數不會超過線程池中線程的數目或者上限(以下簡稱線程池尺寸),而如果服務器不利用線程池來處理這些請求則線程總數為50000。一般線程池尺寸是遠小於50000。所以利用線程池的服務器程序不會為了創建50000而在處理請求時浪費時間,從而提高效率。

這些都是假設,不能充分說明問題,下面我將討論線程池的簡單實現並對該程序進行對比測試,以說明線程技術優點及應用領域。

2 線程池的簡單實現

一般一個簡單線程池至少包含下列組成部分。

線程池管理器(ThreadPoolManager):用於創建並管理線程池

工作線程(WorkThread): 線程池中線程

任務接口(Task):每個任務必須實現的接口,以供工作線程調度任務的執行。

任務隊列:用於存放沒有處理的任務。提供一種緩沖機制。

下面是代碼:

全局文件:

/**********************************
 * @author    <A href="mailto:[email protected]">[email protected]</A>
 * @date        2012/06/13
 * Last update: 2012/06/13
 * License:    LGPL
 *
 **********************************/
 
 #ifndef _GLOBAL_H_
 #define _GLOBAL_H_
 
 #include <sys/types.h>
#include <sys/time.h>
#include <unistd.h>            /* */
#include <stdarg.h>
#include <stddef.h>            /* offsetof() */
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <signal.h>
#include <pwd.h>
#include <grp.h>
#include <dirent.h>
#include <glob.h>
#include <sys/vfs.h>            /* statfs() */

#include <sys/uio.h>
#include <sys/stat.h>
#include <fcntl.h>

#include <sys/wait.h>
#include <sys/mman.h>
#include <sys/resource.h>
#include <sched.h>

#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>        /* TCP_NODELAY, TCP_CORK */
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/un.h>

#include <time.h>              /* tzset() */
#include <malloc.h>            /* memalign() */
#include <limits.h>            /* IOV_MAX */
#include <sys/ioctl.h>
#include <sys/sysctl.h>
#include <crypt.h>
#include <sys/utsname.h>        /* uname() */
#include <semaphore.h>

#include <sys/epoll.h>
#include <poll.h>
#include <sys/syscall.h>
#include <pthread.h>
 #endif

Copyright © Linux教程網 All Rights Reserved