簡體   English   中英

使用-lpthread在C中進行多線程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM