我正在为多线程服务器编写代码。我遇到过这个问题: How to create a server which creates a new thread for each client?
我正在使用已接受答案的骨架,并建议更改第一条评论。我唯一的问题是我不明白评论意味着什么。为什么我必须同步访问client_sock?我已经阅读了较低评论中的描述,但由于pthread行仅在完成accept()之后处理,它如何创建竞争条件?为什么(void *)施放帮助?
另外,请解释
添加信号量或其他同步对象
答案 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
}