多线程服务器客户端代码

时间:2016-01-17 09:58:41

标签: c sockets pthreads client-server

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

我正在使用已接受答案的骨架,并建议更改第一条评论。我唯一的问题是我不明白评论意味着什么。为什么我必须同步访问client_sock?我已经阅读了较低评论中的描述,但由于pthread行仅在完成accept()之后处理,它如何创建竞争条件?为什么(void *)施放帮助?

另外,请解释

  

添加信号量或其他同步对象

1 个答案:

答案 0 :(得分:2)

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

骨架有缺陷并且你需要传递套接字的实际值(转换为指针)的原因是因为否则所有线程将使用完全相同的套接字,以及更早的线程将“神奇地”开始读取和写入最后接受的套接字。至少没有同步,这是信号量进入的地方。

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

所以你需要做一些像(伪代码)

的事情
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
}