听力线程不会打印语句

时间:2013-10-20 13:03:41

标签: c multithreading sockets

我在C中进行套接字编程。本质上,我需要一个在单独的线程中运行不定的侦听循环的服务器,每当它接受新的连接时,它必须创建一个新的客户端线程来处理客户端的请求。

下面我有 main 函数,它声明了一个端口号并调用函数 createListenThread 。此函数创建一个新线程并调用函数 listenLoop

int main(int argc, char *argv[])
{
    int client_port = 6000;
    createListenThread(client_port);
}

void createListenThread(int listen_port)
{   
    pthread_t listen_tid;

    printf("In createListenThread\n");  
    // listenLoop(&listen_port);

    if(pthread_create(&listen_tid, NULL, listenLoop, &listen_port) != 0)
        socketError("Could not create thread\n");       

}

void *listenLoop(void *arg)
{
    pthread_detach(pthread_self());

        int listen_socket, listen_port, *client_socket, struct_size;
    struct sockaddr_in client_addr; 
    pthread_t client_tid;

    listen_port = *((int *)arg);        
    listen_socket = createSocket(listen_port);
    struct_size = sizeof(struct sockaddr_in);

    while(1)
    {  
        printf("In ListenLoop\n");
            client_socket = malloc(sizeof(int));
            *client_socket = -1;
            *client_socket = accept(listen_socket, (struct sockaddr *)&client_addr, &struct_size);

            printf("Received connection request from (%s , %d)\n",
            inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));

            pthread_create(&client_tid, NULL, starterFunction, client_socket);
    }

    close(listen_socket);
} 

我的问题是每当我运行服务器时,只会打印“在ListenThread”“在ListenLoop中”。我甚至尝试过fprintf(stdout,“在ListenLoop中”)和fflush(stdout),但声明仍未打印。当我发表评论时:

if(pthread_create(&listen_tid, NULL, listenLoop, &listen_port) != 0)
         socketError("Could not create thread\n");

并简单地按如下方式调用ListenLoop:

listenLoop(&listen_port);

两个打印报表都出现了。在我创建线程和调用ListenLoop函数的方式中是否存在明显的错误?是否执行了ListenLoop函数?

编辑:我在gdb中运行程序,打印出以下内容:

In createListenThread
[New Thread 0xb7e30b70 (LWP 10024)]   
[Thread 0xb7e30b70 (LWP 10024) exited]
[Inferior 1 (process 10021) exited normally]

为什么线程退出?

2 个答案:

答案 0 :(得分:2)

问题是你的main函数在调用createListenThread后立即返回。您应该等待线程函数在pthread_join内使用createListenThread完成,否则程序可能会在线程函数完成之前终止。在线程上调用pthread_join将等到线程函数返回,因此肯定有机会在main()返回之前运行。

答案 1 :(得分:0)

我希望您将所有函数声明为main ...但是您应该在主线程中调用listenLoop。否则,您创建一个线程来运行循环,主线程被动地等待它。你不会被争论传递,线程等待等困扰。

listenLoop可能是一个真正的空白,不再是一个空白*,因为你没有返回任何东西。

如果你要求一个进程,这是有意义的,因为这是创建一个由init进程采用的守护进程的正确方法,但是对于线程来说它根本没用。