我正在为多线程服务器编写代码。我遇到了这个问题:如何创建一个为每个客户端创建新线程的服务器?
我正在使用建议的第一条评论更改来使用已接受答案的框架。我唯一的问题是我不明白评论的含义。为什么我必须同步对client_sock的访问?我已经阅读了下面的注释中的描述,但是由于仅在接受()完成后才处理pthread行,它如何创建竞争条件?另外,为什么(void *)会有所帮助?
另外,请解释
添加信号量或其他同步对象
至于强制转换,的最后一个参数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
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句