我的目標是創建將由許多客戶端連接的服務器(但數量有限)。客戶端將在局域網中的手機上運行。 所以可以有2部手機,但也可以是10部手機。但我不會限制未來手機的最大數量。C中調整其大小的併發TCP服務器。
我認爲這個與手機的TCP通信會更長(不是簡單的請求/響應,而是兩者之間的較長對話)。所以線程池似乎更適合於很多連接,而只是簡短的請求/響應。
我認爲最好的將只使用簡單的pthreads。我可能可以創建1個線程,每個連接使用移動電話。
但是,可能會出現許多此類連接可能會出現的疑問,並且pthread的數量將會過大。因此,我想同時限制例如10的連接數量,然後爲了使下一個移動電話能夠連接到這樣的服務器那裏另一個已經連接的電話必須事先斷開連接。
我做了這樣的事情:
int cs_fd;
printf("Waiting for new connections on the main thread...\n");
while(1) {
cs_fd = accept_new_connection(ps_fd);
if(cs_fd == FAILURE) {
fprintf(stderr, "accept_new_connection: failed!\n");
return FAILURE;
} else if(cs_fd == CONTINUE) {
continue;
}
// handle new connection on concurrent thread
connection_thread(cs_fd, conn_handler);
}
但這並不限制線程和連接的數目。 我怎麼能做到這樣的事情?
- 將子線程的數量限制爲MAX_NUM_OF_THREADS。
- 接受()新的連接,如果限制不超過。
- 如果子線程數量等於MAX_NUM_OF_THREADS,則等待接受新連接,直到其他人斷開連接。
- 如果有人斷線可以接受新的連接。
- 客戶端應該獲得無法連接的信息,因爲連接太多(連接的設備)並且必須等待。
我覺得比大約是這樣的:
int cs_fd;
pthread_t conn_threads[MAX_NUM_OF_THREADS];
printf("Waiting for new connections on the main thread...\n");
while(1) {
for(int i=0; i<MAX_NUM_OF_THREADS; i++) {
cs_fd = accept_new_connection(ps_fd);
// check cs_fd is correct
conn_threads[i] = connection_thread(cs_fd, conn_handler);
}
// Here is my problem it waits until all child threads will finish
// not just one to resume accepting new connections
for(int i=0; i<MAX_NUM_OF_THREADS; i++) {
pthread_join(&conn_threads[i], NULL);
}
}
現在我覺得是否有些等待使用/信令忍不住。在達到MAX限制時可能會使用pthread_cond_wait(),而在子線程退出時會使用pthread_cond_signal()。
在客戶端知道爲什麼它不能連接的情況下,也許我應該分開的線程與單獨的UDP服務器來請求/響應交換服務器的狀態代碼。
btw,這是一本非常好的網絡書籍:UNIX網絡編程; W. Richard Stevens – Alex
是的,我知道這個概念是僞併發性的,我打算在幾個方面實現這個概念:1.簡單併發但限制最大線程數量2.線程併發併發3。我還使用select()來計劃僞併發。也許我會測試不同解決方案的效率。這是一個研究項目。 現在我發明了threads_manager結構,它將管理多個線程並確保不會超過MAX_LIMIT。如果達到限制,我將使用條件變量來等待。 –