2017-07-03 21 views
1

我正在编写一个程序,该程序可以创建多个到给定IP地址的TCP连接。目前,所有的程序都需要连接。这是我第一次在C中使用多线程,并遇到了一些我无法理解的行为。如果我在connection_handler函数的任何一行设置断点,看起来只有一次被调用,无论num_clients是什么。另外,似乎并不是connection_handler中的所有代码都被执行。 main()功能return EXIT_SUCCESS;前行Wierd多线程行为

struct client_data { 
    int id; 
    in_addr_t ip; 
    int port; 
}; 

int main(int argc, char **argv) 
{ 
    int num_clients, 
     port; 
    in_addr_t ip; 

    num_clients = atoi(argv[1]); 
    ip = inet_addr(argv[2]); 
    port = atoi(argv[3]); 

    struct client_data clients[num_clients]; 
    pthread_t threads[num_clients]; 

    for (int i = 0; i < num_clients; i++) { 
     clients[i].id = id; 
     client[i].ip = ip; 
     client[i].port = port; 
     setup_client_struct(i, ip, port, &clients[i]); 
     pthread_create(&threads[i], NULL, connection_handler, (void *) &clients[i]); 
    } 

    return EXIT_SUCCESS; 
} 

void error(char *msg) 
{ 
    fprintf(stderr, "%s\n", msg); 
    exit(EXIT_FAILURE); 
} 

void * connection_handler(void *thread_arg) 
{ 
    int sock_fd; 
    struct client_data *data; 
    struct sockaddr_in serv_addr; 

    data = (struct client_data *) thread_arg; 
    sock_fd = socket(AF_INET, SOCK_STREAM, 0); 

    if (sock_fd < 0) error("Error creating socket"); 

    bzero((char *) &serv_addr, sizeof (serv_addr)); 
    serv_addr.sin_family = AF_INET; 
    serv_addr.sin_addr.s_addr = data->ip; 
    serv_addr.sin_port = data->port; 

    if (connect(sock_fd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) { 
     error("Error connecting"); 
    } 
    else { 
     printf("Thread No. %d connected\n", data->id); 
    } 

    close(sock_fd); 

    return 0; 
} 
+0

这不是[mcve]。 – Stargateur

+1

在某些线程有机会运行之前,程序退出(通过从主返回)。您可能希望在退出整个过程之前等待您的线程完成。 – Art

+0

@ Stargateur它有什么问题?我知道它并不尽可能短,但我试图让它可读。 – PoVa

回答

2

添加以下代码:

for (int i = 0; i < num_clients; i++) { 
    pthread_join(threads[i], NULL); 
} 

上面的代码行,将有助于等待主线程,直到所有其他创建的线程与它们的执行完成。

+1

您应该展开*为什么* OP应该添加代码。如果OP *不拥有它,它会发生什么。 –