【问题标题】:Listening thread does not print statements监听线程不打印语句
【发布时间】:2013-10-20 13:03:41
【问题描述】:

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

下面是 ma​​in 函数,它声明一个端口号并调用函数 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);
} 

我的问题是,每当我运行服务器时,只有 "In ListenThread""In ListenLoop" 不会打印。我什至尝试过 fprintf(stdout, "In 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]

为什么线程退出?

【问题讨论】:

  • 主线程立即退出。你需要添加一些输入操作符,比如“Press Enter to exit”+scanf。

标签: c multithreading sockets


【解决方案1】:

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

【讨论】:

  • 如果我添加 pthread_join(listen_tid, NULL),它解决了原来的问题,即线程不再存在并且打印了“In ListenLoop”语句。但是,有一个问题破坏了创建单独监听线程的整个目的。这会阻塞主线程,即主线程不能继续做其他工作。有办法解决这个问题吗?
  • 当主进程在主进程结束后终止,所有线程也随之终止。我相当确定没有解决方法,但如果有,我相信有人会纠正我。
  • @NewToAndroid 阅读这个类似问题的一些答案 - 这是我的帮助 stackoverflow.com/questions/11875956/…
【解决方案2】:

我希望你将所有函数声明在 main 之上……但你真的应该在主线程中调用你的 listenLoop。否则,您创建一个线程来运行循环,主线程被动地等待它。而且你不会被参数传递、线程等待等所困扰。

listenLoop 可能是一个真正的 void 而不再是一个 void *,因为你不返回任何东西。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多