問題描述:
程式本意是來乙個客戶端連線就建立乙個執行緒與其通訊,並判斷5秒內如無資料接收則斷開連線,關閉網路描述符與**執行緒資源。
但是結果則不盡人意,執行了一段時間後,通過cd /proc/pid/ 檢視裡面的內容,執行緒已經消失,但其資源未釋放,後通過檢視**,懷疑是主線程傳遞給子執行緒的網路描述符未進行互斥保護,導致傳遞給子執行緒的網路描述符出差錯。
原因:
主線程在使用pthread_create建立執行緒時,如果pthread_create 函式的第四個引數(指標引數)傳入的值會被主線程隨時修改時,這時我們的執行緒從pthread_create 函式的第四個引數獲取的值可能就不是我們想要傳入的值了。
原**與改進後的**(增加紅色部分) /*
功能 : 建立tcp網路套接字
引數1 : 埠號
引數2 : ip位址
返回值: 整型(成功返回0,失敗返回-1)
*/int create_tcp_socket(short port,char *ipv4address)
setsockopt(listensock,sol_socket,so_reuseaddr,&reuser,sizeof(reuser));
if(-1 == (mybind(listensock,port,ipv4address)))
printf("bind sucessed!\n");
if(-1 == listen(listensock,10))
while(1)
else
pthread_t tid;
tid = pthread_self();
printf("main thread is %u\n",(unsigned int )tid );
pthread_detach(*(pthreadid + (acceptsock - 4)));
}pthread_cond_wait(&m_cond,&m_locker); // 用於阻塞執行緒,等待其它執行緒釋放m_locker鎖。
pthread_mutex_unlock(&m_locker); // 釋放互斥鎖
/*fd_set(acceptsock,&allnetsock);
if(1)
driving_send_alarm_info(&allnetsock);*/}
close(listensock);
free(pthreadid);}
/*功能 : 處理不同客戶端執行緒服務函式
引數1 : 網路描述符
返回值: 無
*/void* different_client_pthread_handle_fun(void *arg)
}
linux 多執行緒聊天伺服器
自己寫的linux多執行緒聊天伺服器,可以實現併發,通過鍊錶新增人數。include include include include include include include include include include include typedef struct client typed...
Linux多執行緒伺服器 優化
例1 使用多執行緒提高響應速度假設我們有乙個類似計算器的服務,輸入數字公式,返回相應的結果,如果無解,返回 null r n 假設小明在很短的時間內發出10個請求,如果用單執行緒來乙個處理乙個,那麼這些請求會在佇列裡依次處理。假設乙個請求響應時間是10ms,那麼第二個請求響應時間將會為20ms 等第...
多執行緒伺服器
posix執行緒庫 a 與執行緒有關的函式都構成了乙個完整的系列,絕大多數函式的名字都是以 pthread 打頭的。b 要使用這些庫函式,要引入標頭檔案。c 鏈結這些執行緒庫函式時要使用編譯命令的 lpthread 選項。int pthread create pthread t thread,con...