Linux下多執行緒伺服器端的實現

2021-08-17 17:01:04 字數 3074 閱讀 9768

linux下多執行緒程式設計時,編譯命令需要加上-lpthread選項。

g++ test.cpp -o test -lpthread

執行緒的建立

執行緒具有單獨的執行流,所以會有自己的main函式。建立執行緒的函式如下:

int pthread_create(pthread_t * restrict thread,const thread_attr_t * restrict attr,void *(* start_routine)(void *),void * restrict arg);
引數含義:

attr:傳遞執行緒屬性的引數,傳遞null表示選擇預設屬性。

start_routine:乙個函式指標,該指標指向的函式作為執行緒的main函式。

成功時返回0,失敗時返回其他值。

示例:

#include#include#includeusing namespace std;

void* threadmain(void *arg); //新建立執行緒的main函式

int main()

sleep(10);

cout<<"end of main.\n";

return 0;

}void* threadmain(void *arg) //引數來行是void*指標,而pthread_create第四個引數的型別原本是int*指標,因此需要強制轉換一下

if(pthread_join(tid,&threadret)!=0) //阻塞等待執行緒結束,threadret存放執行緒main函式的返回值的位址

cout<<"thread return message:"<(threadret);

delete threadret; //執行緒main函式返回的位址值是動態分配得來的,因此記得delete,不然會發生記憶體洩漏

return 0;

}void* threadmain(void *arg)

執行緒間的同步

同一程序中多個執行緒是共享全域性資料區和堆區域的,但是有各自的棧區域。因此執行緒間進行通訊是很容易的,但多個執行緒隨意訪問全域性資料,又會造成資料的不一致性。例子我就不舉了,學過作業系統的都了解。不能同時訪問的資源稱做臨界資源。

執行緒的同步有兩個方面:

(1)同時訪問某一記憶體空間。這時候需要互斥訪問來保證資料的一致性。這裡用到的互斥量。

(2)需要指定同一記憶體空間的執行緒執行順序。典型的例子就是讀寫者問題,對於某個緩衝區,寫者需要先寫,然後通知讀者來讀。這裡用到的是訊號量。

互斥量互斥量簡單的理解就是一把鎖。第乙個訪問臨界資源的執行緒到來時,先把鎖鎖上,然後訪問,訪問完之後再解鎖。因此如果在它訪問的過程中,第二個執行緒到來了,當它想像第乙個執行緒一樣進行「上鎖-->訪問-->解鎖」的操作時,發現鎖已經鎖上了,因此這時候它會阻塞等待,直到第乙個執行緒解鎖。之後到來的執行緒也是一樣。這樣就實現了互斥訪問臨界資源。

互斥量的建立函式和銷毀函式:

int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *attr);

int pthread_mutex_destroy(pthread_mutex_t *mutex);

引數含義:

attr:傳遞建立的互斥量的屬性,null表示選擇預設屬性。

成功時返回0,失敗時返回其他值。

上鎖和解鎖的函式:

int pthread_mutex_lock(pthread_mutex_t *mutex);

int pthread_mutex_unlock(pthread_mutex_t *mutex);

成功時返回0,失敗時返回其他值。

示例:#include#include#include#include#include#includeusing namespace std;

const int numthread=10;

void* threadinc(void *arg);

void* threaddec(void *arg);

long long num;

pthread_mutex_t mutex; //定義互斥量

int main()

void* write(void *arg)

return null;

}void* read(void *arg)

cout<<"result:"《多執行緒伺服器端的實現

接下來就是實現多執行緒伺服器端了,寫乙個簡單的聊天伺服器。

server.cpp:

#include#include#include#include#include#include#includeusing namespace std;

const int buf_size=100;

const int max_client=256;

int clientcnt;

int clientsocks[max_client];

pthread_mutex_t mutex;

void* handleclient(void *arg);

void sendmsg(char *msg,int len);

void errorhandling(char *msg);

int main()

void errorhandling(char *msg)

strcpy(buf,name);

strcat(buf,":");

strcat(buf,input);

write(sock,buf,strlen(buf));

} return null;

}void* recvmsg(void *arg)

{ int sock(*(static_cast(arg)));

char output[buf_size];

while(1)

{ int len(read(sock,output,buf_size-1));

if(len==-1) return (void *)-1;

output[len]=0;

cout<

多執行緒伺服器端的實現

1.單cpu系統中如何同時執行多個程序?請解釋該過程中發生的上下文切換。答 只有1個cpu cpu的運算裝置core 的系統中不是也可以同時執行多個程序嗎?只是因為系統將cpu時間分成了多個微小的塊後分配給了多個程序。為了分時使用cpu,需要 上下文切換 的過程。2.為何執行緒上下文切換更快?執行緒...

多執行緒TCP程式伺服器端

多執行緒tcp程式伺服器端 1.建立serversocket物件,指定監聽的埠號。2.把accept 方法作為迴圈條件,迴圈監聽客戶端請求。3.建立執行緒類,定義乙個socket型別的成員變數,並定義乙個可以為他賦值的建構函式方法。4.在run 方法中使用socket變數進行任意的通訊操作。5.在主...

實現伺服器端的多執行緒SOCKET Server

想要實現的功能 在伺服器端有乙個控制台程式 或者windows服務 與多個客戶端程式通訊,其中主線程有乙個socket繫結在乙個固定埠上,負責監聽客戶端的socket資訊。每當啟動乙個客戶端程式,客戶端傳送來乙個socket連線請求,server端就新開啟乙個執行緒,並在其中建立乙個socket與該...