利用多執行緒併發模型,實現TCP檔案傳輸

2021-08-31 07:42:11 字數 3268 閱讀 2692

多執行緒的程序和單執行緒的程序比較

更高的效率:上下文切換的額外開銷減少

上下文切換:執行緒切換需要執行的指令

同一程序中的兩個執行緒比不同程序中的兩個執行緒切換要快

程序內的執行緒切換不用改變虛擬儲存器的對映

共享儲存:

併發伺服器中的多個副本需要相互通訊或者訪問共享的資料

利用執行緒容易構造監控系統

但是由於執行緒間共享儲存和程序狀態,乙個執行緒的動作可能對同乙個程序內的其他執行緒產生影響。

兩個執行緒如果同一時刻訪問同乙個變數,會產生相互干擾

呼叫乙個靜態的資料項的庫函式不是執行緒安全(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...