[英]multithreading in C using -lpthread
因此,我設計了一個服務器來實時接受多個客戶端,其中客戶端將“講話”,而服務器將“重復”它。 在我退出之前,客戶將一直保持活躍狀態。 我嘗試使用-lpthread實現此功能,但服務器將接受所有客戶端連接,但隨后會忽略從第一個客戶端收到的所有命令。 這是我到目前為止嘗試過的:
int main(int argc, char *argv[]) {
pthread_t client_thread;
pthread_attr_t attr;
...
while(1) { /* main accept() loop */
sin_size = sizeof(struct sockaddr_in);
if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, \
&sin_size)) == -1) {
perror("accept");
continue;
}
printf("server: got connection from %s\n", \
inet_ntoa(their_addr.sin_addr));
pthread_attr_t attr;
pthread_attr_init(&attr);
for (int i = 0; i < MAX_CLIENTS; i++) {
pthread_create(&client_thread, &attr, decider, new_fd);
pthread_join(client_thread,NULL);
}
...
目前,我只能在多線程或線程池之間進行選擇。 謝謝。
您調用pthread_create
,然后立即調用pthread_join
。
這樣做的問題是pthread_join
將等待線程退出,從而使您的代碼變為串行而不是並行。
如果要在接收連接時動態創建線程,請創建一個線程。 不要在所有線程處理完全相同的連接的循環中創建MAX_CLIENT
線程。
如果你想使用一個線程池,然后第一 “主接受()循環”之前創建的所有線程,並且簡單地讓它們什么也不做(以開始)。 然后使用(受保護的)隊列在其中添加新的連接,線程檢查該隊列中的新連接,並且一個尚未處理連接的線程將對其進行處理。
在偽代碼中,如下所示:
thread_function()
{
while (true)
{
sleep_while_queue_is_empty();
get_descriptor_from_queue();
handle_connection();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.