linux下多執行緒伺服器處理程式問題解決

2021-06-18 05:39:09 字數 1393 閱讀 4565

問題描述:

程式本意是來乙個客戶端連線就建立乙個執行緒與其通訊,並判斷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...