C S 執行緒函式是否應該放入C 類中?

2021-08-20 21:38:23 字數 2251 閱讀 8481

在寫乙個c/s的客戶端時,想要把收和發分開處理,於是很自然的想到了要用到執行緒。

在用c語言寫的時候**可以除錯出來,因為是結構化程式設計,所以函式與函式之間耦合性不是很強,執行緒函式也就沒有與其他函式起衝突。但是當我想要把**改為c++實現時,出現問題了。

把函式封裝在類裡,寫成成員函式的形式,體現內聚性。我們寫的**應該盡量的高內聚、低耦合。

一旦使用類,所有函式都封裝作為類的成員函式,那麼,建立執行緒時,必然會建立新的物件。接著執行新的物件的建構函式,執行執行緒函式,遞迴,程式會崩潰。。也嘗試把執行緒函式寫為類的友元函式 (類中函式宣告前加friend),可是建立執行緒的函式 pthread_create() 的引數依然是個問題,如果傳入套接字,那麼誰來接收?如果是這個類的另乙個物件接收,勢必會執行預設的拷貝建構函式。所以還是會出現上述問題。

當然,如果形參寫的是引用的話,不會多拷貝乙份實參,這個方法我還沒有嘗試。

想到的另一種方式是,建立兩個類。乙個用於接收,另乙個用於傳送。此外,把執行緒函式的宣告放在兩個類的外面。

下面是部分**,供以參考:

//建構函式,實現初始化的操作

tellersend::tellersend()

cout << "connnect to server success!" << endl;

//開執行緒(只用於接收伺服器的應答訊息)

int ret = -1;

int newfd = this->sfd; //將此套接字作為執行緒引數傳遞

pthread_t rcvthread;

ret = pthread_create(&rcvthread, null, handlercv, (void *)newfd);

if (-1 == ret)

handlesnd(); //向伺服器傳送請求(主線程)

}

接著是執行緒函式:

//接收伺服器的應答訊息

void *handlercv(void *arg)

然後是接收類的建構函式:

//建構函式,只用於接收(根據接收的包頭資訊的不同,執行相應的成員函式)

tellerrecv::tellerrecv(int newsfd = -1)

//根據接收到的包頭中的命令,接收之後不同的包體

switch ( qhead.cmd )

break;

case 1:

break;

//...

default:

break;

} }}

最後給出標頭檔案中類的宣告:

//傳送類

class tellersend

;

void tcpconnect(const char *ip, const int port); //連線伺服器

void handlesnd();

int getcommand(); //選單項

void loginsnd(); //櫃員註冊

void landsnd(); //櫃員登陸

void quitsnd(); //客戶端退出

protected:

private:

int sfd; //連線伺服器的套接字

int cmd; //接收選單項輸入(命令)

};//接收類

class tellerrecv;

void loginrcv();

void quitrcv();

void landrcv();

protected:

private:

int sfd;

int cmd;

};extern int landflag; //登陸成功標誌

extern void *handlercv(void *arg); //執行緒函式(在此執行緒函式中建立新的物件)

extern void logininput(requestlogin &arg); //註冊資訊錄入

#endif

如果讀者有更好的方式處理執行緒和類的問題,歡迎指正。

c 執行緒建立呼叫類中函式

在編寫eventloopthread類中,需要在類中創造新執行緒並呼叫類中的函式,卻發現pthread create函式報錯,引數不匹配。例子如下 class eventloppthread void eventloopthread func void 省略實現 void eventloopthre...

C 類中定義執行緒

1.c 中如何定義執行緒函式 有兩種方法 a.定義執行緒函式為全域性函式 b.定義執行緒函式為類的靜態成員函式 2.c 中的執行緒函式如何訪問類中的成員變數 class cmyclass void cmyclass testfunc thread function adapter int cmycl...

C 類中建立執行緒

經常會遇到需要在類中建立執行緒,可以使用靜態成員函式,並且將類例項的指標傳入執行緒函式的方式來實現。實現 如下 類標頭檔案 ctestthread.h include include includeclass testthread 類原始檔 ctestthread.cpp include ctest...