从主题突破主要循环。 (C编程)

时间:2012-06-06 18:38:42

标签: c multithreading while-loop

我目前正在C中编写一个Basic Client Server消息传递程序。 我遇到的问题是服务器端代码。 代码的主要部分是一个while循环,用于检查来自客户端的新传入套接字连接。 如果客户端连接,则会生成一个处理传入消息的新线程。我使用tcp_wait_for_connection( server );这个函数是阻塞的。

所以我的问题是,是否可以打破来自其中一个线程的while循环而不必使用Exit()以便我可以关闭套接字

(我是Stack的新手,所以我不知道我是否应该在这里发布我的完整代码,我在下面放置了最相关的部分,如果你需要更多,我会编辑帖子。

由于

代码如下:

while(1) {

    client = (Socket *) malloc( sizeof(Socket) ); //allocate memory for the new client socket
    if ( client == NULL ){
        perror("Allocation of memory for the new client has failed");
        return 1;
    }
    //wait for a client to connect
    *client = tcp_wait_for_connection( server );
    printf("Incoming client connection\n");
    //get the socket descriptor for the new client socket
    sd = get_socket_descriptor(client);
    //insert the new client socket into the client list with the sd as ID
    InsertElement(&cl, (Element)client, sd);

    p_thread = (pthread_t *) malloc( sizeof(pthread_t) ); //allocate memory for the new thread handler
    if ( p_thread == NULL ){
        perror("Allocation of memory for the new thread has failed");
        return 1;
    }
    //insert the new thread handler into the thread handler list
    //with the sd of the corressponding client socket as ID
    InsertElement(&tl, (Element)p_thread, sd);
    //create the new thread
    pthread_create(p_thread, NULL, HandleClient, (void*)p_thread);

}
tcp_close( *client );
tcp_close( server );

1 个答案:

答案 0 :(得分:1)

不,你不能这样做。我建议您只调用从子线程关闭套接字的函数。使用pthread_mutex确保您一次只能从一个线程执行此操作。此外,在main中,处理由于套接字已正确关闭而发生的tcp_wait_for_connection错误。