多執行緒伺服器

2021-08-05 18:46:40 字數 2129 閱讀 4560

posix執行緒庫:

a) 與執行緒有關的函式都構成了乙個完整的系列,絕大多數函式的名字都是以「pthread_」打頭的。。

b) 要使用這些庫函式,要引入標頭檔案。

c) 鏈結這些執行緒庫函式時要使用編譯命令的」-lpthread」選項。

int pthread_create(pthread_t *thread,const pthread_attr_t *attr,void*(*start_toutine)(void*),void *arg)

功能:建立乙個新的執行緒

引數:a) thread:返回執行緒id

b) attr:設定執行緒的屬性,attr為null表示使用預設屬性

c) start_routine:是個函式指標,執行緒啟動時要執行的函式

d) arg:傳給執行緒啟動函式的引數

返回值:成功返回0,失敗返回錯誤碼。

錯誤碼:

a) 傳統的函式,成功返回0,失敗返回-1,並且對全域性變數errno賦值以錯誤指示。

b) pthreads函式出錯時不會設定全域性變數errno,而是將錯誤碼通過返回值返回。

c) pthread同樣也提供了縣城內的errno變數,以支援其使用errno**。對於threads函式的錯誤,建議通過返回值來判定,因為讀取返回值要比讀取執行緒內的errno變數的開銷更小。

int pthread_join(pthread_t thread,void **retval)

功能:**建立的程序

引數:thread,被**執行緒的id,執行緒退出時的狀態,不關心的話可以設為null。

返回值:成功返回0,失敗返回錯誤碼。

說明:如果未呼叫該函式,將會出現殭屍執行緒,當然可以把該執行緒設定為分離態,由核心負責**。

void pthread_exit(void *retval);

功能:退出本執行緒,注意不能使用exit,任意乙個執行緒呼叫exit,都會導致程序的退出。

引數:retval記錄執行緒退出時的狀態,不關心可設定為null。

int pthread_cancel(pthread_t thread)

功能:取消乙個執行中的執行緒。

引數:thread,執行緒id。

返回值:成功返回0,失敗返回錯誤碼。

int pthread_detach(pthread_t thread)

功能:將該執行緒分離,其**由核心負責。

引數:thread,執行緒id

返回值:成功返回0,失敗返回錯誤碼。

#include#include#include#include#include#include#include#include#include#include#include#include#define err_exit(m) dowhile(0)

void* do_service(void *arg)

else if (ret == 0)

fputs(recvbuf, stdout);

write(connfd, recvbuf, strlen(recvbuf));

} close(connfd);//關閉套接字

return null;

}void handle_sigchild(int sig)

int main(void)

close(listenfd);

}

細節問題:

a) 因為伺服器主線程只負責監聽套介面,不負責**建立的執行緒,因此建立的執行緒需要設定為分離態,由核心負責**,否則會出現殭屍執行緒。

b) 建立的執行緒要自己關閉套介面,主線程不負責這項工作。

c) pthre_create函式傳引數,有三種做法:第一,pthread_create(&tid,null,do_service,(void *)connfd),這種做法不可移植,因為在64位作業系統裡,位址是8位,而int是4位, 這麼做會出問題,需要將connfd轉成8位的long型別程式才能正確執行。第二,pthread_create(&tid,null,do_service,(void *(&connfd)),這個做法會出問題,如果同時到達多個連線,由於是取的是位址,因此他的值可能在新的執行緒裡改變,出現錯誤。第三,使用int *p=(int*)malloc(sizeof(int)),*p=connfd,這樣可以避免上面兩者問題。

多執行緒時間伺服器

include stdafx.h include include include include include define port 8080 int x 1 void error char str dword winapi new client proc lpvoid lpparam prin...

ACE多執行緒伺服器

ace adaptive communication environment 它是乙個物件導向的 跨平台的 開放原始碼的網路程式設計基礎設施框架。ace 是由加利福尼亞大學irvine分校的douglas c.schmidt 博士主導開發的,是一種跨平台可編譯的網路程式設計api,並隨後在工業界中發...

多執行緒的伺服器

許多實際應用要求伺服器具有同時為多個客戶提供服務的能力。用多個執行緒來同時為多個客戶提供服務,這是提高伺服器的併發效能的最常用的手段。主要有3種方式來實現 第一種方式的不足之處 執行緒池為執行緒生命週期開銷問題和系統資源不足問題提供了解決方案。執行緒池中預先建立了一些工作執行緒,它們不斷從工作佇列中...