該模型和多程序模型的思想類似,只是把程序換成了執行緒,因為執行緒的建立比程序建立開銷小。但這並不是說多執行緒就一定比多程序優秀,程序和執行緒都有各自的優缺點,具體請自行查閱執行緒和程序相關的內容,完整**戳這裡
#include #include #include #include #include #include #include #include /* see notes */
#include #include #include /* superset of previous */
#include #include "public_head.h"
#define listen_backlog 50
sem_t sem;
void *thread_func(void *arg)
; char write_buff[256] = ;
while (1)
printf("\n");
close(acceptfd);
return null;
}int main(int argc, char ** argv)
; pthread_t tid;
memset(&server_addr, 0, sizeof(server_addr));
memset(&client_addr, 0, sizeof(client_addr));
if((sockfd = socket(af_inet, sock_stream, 0)) < 0)
handle_error("socket");
server_addr.sin_family = af_inet;
server_addr.sin_port = htons(9527);
server_addr.sin_addr.s_addr = htonl(inaddr_any);
if(bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
;close(sockfd);
strerror_r(errno, buff, sizeof(buff));
handle_error("bind");
}if(listen(sockfd, listen_backlog) < 0)
sem_init(&sem, 0, 0);
while(1)
memset(client_ip, 0, sizeof(client_ip));
inet_ntop(af_inet,&client_addr.sin_addr,client_ip,sizeof(client_ip));
printf("client:%s:%d\n",client_ip,ntohs(client_addr.sin_port));
if(pthread_create(&tid, null, thread_func, &acceptfd) != 0)
//wait thread start
//if(sem == 0) block
//wait for sem != 0
//unblock, sem -= 1
sem_wait(&sem);
}sem_destroy(&sem);
close(sockfd);
return 0;
}
(五十二)高併發伺服器 多執行緒模型
在使用執行緒模型開發伺服器時需考慮以下問題 1.調整程序內最大檔案描述符上限 2.執行緒如有共享資料,考慮執行緒同步 3.服務於客戶端執行緒退出時,退出處理。退出值,分離態 4.系統負載,隨著鏈結客戶端增加,導致其它執行緒不能及時得到cpu 多執行緒的機制一般是使用執行緒池,模型如下 0 以下是出錯...
併發伺服器模型 多執行緒伺服器
coding utf 8 from socket import from threading import thread from time import sleep 處理客戶端的請求並執行事情 def dealwithclient newsocket,destaddr while true rec...
高併發伺服器學習筆記之七 非同步IO poll模型
poll模型和select模型很相似。兩者間的主要區別在於我們要如何指定待檢查的檔案描述符。在select中,我們提供三個集合,在每個集合中標明我們感興趣的檔案描述符。而在poll中我們提供一列檔案描述符,並在每個檔案描述符上標明我們感興趣的事件,完整 戳這裡 用到的系統呼叫如下 include i...