多執行緒的程序和單執行緒的程序比較
更高的效率:上下文切換的額外開銷減少
上下文切換:執行緒切換需要執行的指令
同一程序中的兩個執行緒比不同程序中的兩個執行緒切換要快
程序內的執行緒切換不用改變虛擬儲存器的對映
共享儲存:
併發伺服器中的多個副本需要相互通訊或者訪問共享的資料
利用執行緒容易構造監控系統
但是由於執行緒間共享儲存和程序狀態,乙個執行緒的動作可能對同乙個程序內的其他執行緒產生影響。
兩個執行緒如果同一時刻訪問同乙個變數,會產生相互干擾
呼叫乙個靜態的資料項的庫函式不是執行緒安全(thread safe)的,覆蓋將會導致錯誤
缺乏健壯性,乙個執行緒出錯,伺服器將會終止整個程序
server.c
// tcp_server_thread.c
/* tcpmtechod.c - main, tcpechod, prstats */
#include #include #include #include #include #include #include #include #include #include #include #include #include #define qlen 32/* maximum connection queue length*/
#define bufsize 4096
#define interval 5/* secs */
struct stats;
void prstats(void);
int tcpechod(int fd);
//interrexit(const char *format, ...);
int passivetcp(int qlen);
int main(int argc, char *argv)
else
if(pthread_create(&th, &ta, (void * (*)(void *))tcpechod, (void *)ssock) < 0)
printf("pthread_create error"); }
} int passivesock(/*const char* service,*/ const char *transport, int qlen)
if(bind(s, (struct sockaddr *)&sin, sizeof(sin)) < 0)
if(type == sock_stream && listen(s, qlen) < 0)
printf("can not listen the port...");
return s;
}int passivetcp(int qlen)
int processfile(int ssock)elseelse
break;
}strcpy(filename,filepath+(strlen(filepath)-k)+1);
}printf("filename :%s\n",filename);
fp = fopen(filename,"w");
if(fp!=null)
int writelength = fwrite(buffer,sizeof(char),filetrans,fp);
if(writelength < filetrans)
(void) pthread_mutex_lock(&stats.st_mutex);
stats.st_bytecount += filetrans;
(void) pthread_mutex_unlock(&stats.st_mutex);
bzero(buffer,bufsize);
}printf("recv finished!\n");
fclose(fp);
}else
//kill(spid, sigterm);
return 0;
}int tcpechod(int fd)
void prstats(void)
(void) printf("%-32s: %lu\n\n", "total byte count", stats.st_bytecount);
(void) pthread_mutex_unlock(&stats.st_mutex); }
}
client.c
//tcp_client.c
#include #include #include #include #include #include #include #include //for malloc
#define buffer_size 1024
int main()
memset(&server,0,sizeof(server));
server.sin_family= af_inet;
server.sin_port = htons(8888);
if(inet_pton(af_inet,"127.0.0.1",&server.sin_addr)<0)
if(connect(sockcd,(struct sockaddr*)&server,sizeof(server))<0)
//connect with server
printf("file path:\n");
scanf("%s",filepath);//get filepath
fp = fopen(filepath,"r");//opne file
if(fp==null)
printf("filepath : %s\n",filepath);
lenpath = send(sockcd,filepath,strlen(filepath),0);// put file path to sever
if(lenpath<0)
else
sleep(1);
while((filetrans = fread(buffer,sizeof(char),buffer_size,fp))>0)
bzero(buffer,buffer_size);
//memset(buffer,0,sizeof(buffer));
}fclose(fp);
close(sockcd);
return 0;
}
執行結果:
多執行緒併發模型
多執行緒併發模型 基於threading的多執行緒併發 對比多程序併發 1.優點 資源消耗小 2.缺點 需要注意共享資源的爭奪 python多執行緒收到gil的影響 實現方式 threading socket 模組完成 實現步驟 1.建立套接字,繫結,監聽 2.接收客戶端連線請求,建立新的執行緒 3...
同步,多執行緒 ,多執行緒方式實現併發。
io請求幾乎不佔cpu的。同步請求相當於排隊買東西,乙個卡主了,其他的都結不了賬了。執行緒並不是越多越好,如果他特別多還不如同步高,所以對執行緒要有個限制,所以就出現了執行緒池,執行緒池在python3裡才有的,python2裡沒有的。建立程序的話是耗費很多資源的,建立執行緒是幾乎不耗費資源的。建立...
網路程式設計 套接字併發 tcp併發多執行緒
基於tcp併發多執行緒的客戶端,多個客戶端都是一樣的測試 import socket phone socket.socket socket.af inet,socket.sock stream phone.connect 127.0.0.1 8080 while true x input 客戶端 s...