c - 另一个进程和线程问题

标签 c linux pthreads

这个问题与Many processes executed by one thread有关和 Socket server or file server implementation using multiple threads: concept not clear .

有几件事我还不清楚。现在套接字服务器或文件服务器的客户端和服务器不需要在不同的机器上(当然也可以)。

服务器收到的请求来自不同的进程,但它们由线程处理(比如每个进程一个),并且这些任务线程属于不同的进程(服务器进程)。我感到困惑的是,来自不同进程的调用如何由单个进程的线程处理,并且这些线程使用“共享内存”架构进行通信,这种架构非常“线程”,与“进程”非常不同

谢谢

最佳答案

一些简单的基础工作。您的服务器进程包含一个或多个线程来处理来自任意数量的客户端进程的请求。客户端和服务器可以在同一台或不同的机器上。客户端和服务器通过套接字“连接”,套接字用于将请求从客户端发送到服务器。一旦处理完请求,将使用相同的套接字向客户端提供响应。每个客户端都将与服务器建立唯一连接。

如上所述,有许多方法可以实现服务器。一种可能性是服务器有一个线程使用 select() 处理套接字。让我们称之为主线程。服务器进程也将有几个线程负责处理请求和响应客户端。让我们调用这些工作线程。

当主线程从其客户端套接字之一接收到消息时,主线程将接受此请求并将其交给其中一个工作线程进行处理。工作线程将接收该请求并对其进行处理,然后使用原始套接字进行响应。

此服务器模型使用生产者/消费者模型,其中主线程是生产者(因为它从套接字接收请求并产生需要处理的工作),而消费者是工作线程。

实现这种类型的服务器有几个挑战,所有这些都在各种数据结构和算法文本中进行了记录和讨论,其中最重要的是:

  • 主线程和工作线程如何通信?
  • 如何保护各个线程共享的数据不被同时修改?
  • 如何选择应由哪个工作线程处理请求?

希望对您有所帮助。

关于c - 另一个进程和线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6234606/

相关文章:

c - 如何在 concatenate-stringify 级联中延迟宏替换

c - fcntl Unix/Linux系统调用的全称是什么

c++ - 如何统计n个线程和fork()的创建和终止时间?

c++ - 尽管有互斥锁,线程中的竞争条件

c++ - 套接字编程中连接错误的原因(在客户端)?

c - 32 位系统中积分算法更快

c - 无法找到二次方程代码中的错误

linux - 用于在未执行的 EC2 实例中启动服务的用户数据 bash 脚本

linux - 操作系统如何知道物理内存的实际大小?

c++ - 多线程和类的全局实例?