多线程服务器客户端代码

Multithreaded server client code

我正在为多线程服务器编写代码。我遇到过这个问题: How to create a server which creates a new thread for each client?

我正在使用已接受答案的框架以及对第一条评论的建议更改。我唯一的问题是我不明白评论的意思。为什么我必须同步访问 client_sock ?我已经阅读了下面评论中的描述,但是由于 pthread 行仅在 accept() 完成后才被处理,它如何创建竞争条件?还有为什么 (void *) 施法帮助?

另外,请说明

add a semaphore or other synchronization object

至于转换,pthread_create 的最后一个参数是一个 指针 ,并将成为线程函数的参数。如果你想传递不是指针的东西,那么你需要将它转换为指针,并在线程函数中进行相应的转换以取回原始类型。

骨架有缺陷并且您需要传递套接字的实际值(转换为指针)的原因是否则 所有 线程将使用完全相同的套接字, 较早的线程将 "magically" 开始读取和写入最后接受的套接字。至少没有同步,这就是信号量的用武之地。

如果你用信号量(或其他同步原语)保护已接受的套接字,那么你仍然可以传递一个指针,并在线程复制实际套接字值后释放线程中的信号量。

所以你需要做类似的事情 (pseudo-code)

while (not_exit_server_program)
{
    wait_for_new_connection_to_arrive();
    wait_for_semaphore(socket_semaphore);
    new_socket = accept(...);
    pthread_create(..., &new_socket);
}

然后在线程函数中

void *client_thread_function(void *pointer_to_socket)
{
    int socket = *(int *) pointer_to_socket;
    release_semaphore(socket_semaphore);

    ... rest of function
}