基於linux的程序池的實現,併發程序池有多種實現模式,在這裡統一進行分析。首先給出客戶端的測試**:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
const
int clientnum =10;
// 建立使用者個數
const
int nloop =
100;
// 每個使用者動態建立連線個數
static
int cnt =0;
void sig_handler (
int sig)
pid_t pid;
while
((pid = waitpid (-1
,null
, wnohang)
)>0)
if(cnt >= clientnum)
}int main (
int argc,
char
* ar**)
int port = atoi (ar**[2]
);if(port <
1024
|| port >
65535
)struct sockaddr_in serv;
bzero (
&serv,
sizeof
(serv));
if(inet_pton (af_inet, ar**[1]
,&serv.sin_addr)==-
1)serv.sin_family = af_inet;
serv.sin_port = htons (port)
;struct sigaction sa;
bzero (
&sa,
sizeof
(sa));
sa.sa_handler = sig_handler;
sa.sa_flags = sa_restart;
if(sigaction (sigchld,
&sa,
null
)<0)
for(
int i =
0; i < clientnum;
++i)
if(connect (fd,
(struct sockaddr*
)&serv,
sizeof
(serv)
)<0)
const
char
* buf =
"hello world !\n"
;for
(int j =
0; j < nloop;
++j)
close (fd)
; printf (
"client %d end...\n"
, i)
; exit (0)
;}}while
(true
) exit (0)
;}
這裡介紹的是使用不帶鎖的accept
結構的程序池。原理是:如果有多個accept
函式等待監聽核心中同乙個fd,那麼沒有資料時都阻塞。如果有資料,那麼所有的都會被喚醒,但是只能有乙個程序獲取fd,其餘的喚醒後接著休眠。這種結構簡單,但是出現執行緒池「驚群」現象,這裡的喚醒和休眠會浪費大量的時間,併發度高的時候,更是如此。但是對於少量併發的情況,還是比較合適的,給出**實現:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
const
int max_process_number =15;
const
int max_buffer_size =
1024
;bool stop_server =
false
;pid_t* pids =
nullptr
;int processnum =0;
void sig_int (
int signo)
;// 終止整個執行緒池
void process (
int fd)
;// 子程序處理連線
pid_t child_make (
int fd)
;// 產生新的子程序
void child_main (
int fd)
;// 子程序的主要操作
int main (
int argc,
char
* ar**)
int port = atoi (ar**[1]
);if(port <
1024
|| port >
65535
) processnum = atoi (ar**[2]
);if(processnum <
0|| processnum > max_process_number)
struct sockaddr_in serv;
bzero (
&serv,
sizeof
(serv));
serv.sin_family = af_inet;
serv.sin_port = htons (port)
; serv.sin_addr.s_addr = htonl (inaddr_any)
;int listenfd = socket (af_inet, sock_stream,0)
;if(listenfd <0)
if(bind (listenfd,
(struct sockaddr*
)&serv,
sizeof
(serv)
)<0)
if(listen (listenfd,32)
<0)
struct sigaction sa;
// 註冊終止訊號
bzero (
&sa,
sizeof
(sa));
sa.sa_handler = sig_int;
sa.sa_flags = sa_restart;
if(sigaction (sigterm,
&sa,
null
)<0)
pids =
new pid_t[processnum]
;for
(int i =
0; i < processnum;
++i)
while
(!stop_server)
exit (0)
;}void sig_int (
int signo)
for(
int i =
0; i < processnum;
++i)
if(pids !=
nullptr
) stop_server =
true;}
pid_t child_make (
int fd)
child_main (fd);}
void child_main (
int fd)
puts (
"accept data");
process (connfd)
; close (fd);}
}void process (
int fd)
printf (
"%s"
, buf);}
}
Linux 程序池實現
程序池在伺服器應用中有很多很多 下面是半同步半非同步程序池的實現 ifndef processpool h define processpool h include include include include include include include include include inc...
程序,執行緒與執行緒池(1)
傳統方法 建立乙個新的執行緒,由該執行緒執行任務,任務執行完畢後執行緒退出 即時建立,即時銷毀 如果提交給執行緒的任務是執行時間較短,執行次數頻繁,那麼不斷銷毀和不斷建立的開銷則是不可忽略的。執行緒池採用預建立技術,在應用程式啟動之後,立即建立一定數量的執行緒,放入空閒佇列中,這些執行緒處於阻塞狀態...
linux下的程序
在我們linux的學習中,有乙個很重要的概念就是程序,程序就是 程式的乙個執行例項,是擔當分配資源的實體,是資源競爭的最小單位。簡單來說就是正在執行的程式。我們在學習linux的時候,會發現有乙個規律就是管理者先將被管理者進行描述在組織起來。對於程序來說,linux用一種來存放關於乙個程序的描述資訊...