【问题标题】:send over IP immediately on different thread在不同的线程上立即通过 IP 发送
【发布时间】:2011-06-24 00:44:08
【问题描述】:

这可能是不可能的,但我还是要问。我有一个多线程程序(服务器),它在专用于 IP 通信的线程上接收请求,然后将其传递给工作线程以完成工作,然后我必须将带有答案的回复发送回客户端并在何时发送它实际上已经完成,尽可能少的延迟。目前,我正在使用消费者/生产者模式并将回复放在队列中,以便 IP 线程起飞并发回给我的客户。然而,这并不能保证这将在何时发生,因为 IP 线程可能不会很快被安排,我不知道。这让我的客户,也就是阻止这个调用,认为请求失败了,这显然不是重点。

由于我无法在客户端进行更改,我需要在我这边解决这个发送问题,我面临的问题是我不想开始共享我的 IP 对象(目前只有在 1 个线程上)与工作线程,因为那样事情变得过于复杂。我想知道是否有某种方法可以使用线程同步机制来确保当我的工作线程完成时,IP 线程将执行我将回复发送回客户端?

手动/自动重置事件会为我执行此操作,还是不能保证立即唤醒线程?

【问题讨论】:

  • 你没有提到你的平台。我想线程同步机制差异很大,因为它们不是由标准定义的。
  • 操作系统:仅限 Windows

标签: c++ multithreading concurrency tcp


【解决方案1】:

如果您需要立即发送,最好的办法是硬着头皮开始共享连接对象。当然,在访问它之前锁定它,并且一定要考虑如果发送缓冲区已经满了你会做什么(连接线程将需要处理发送第一次不适合的消息部分,否则工作线程将被阻塞,直到客户端接受您发送的一些数据)。如果您的客户一次只运行一个请求,这可能不会太困难;如果是这种情况,您可以在工作线程开始处理时简单地将客户端对象的所有权传递给它,并在完成后将其传回。

另一种选择是使用实时线程。操作系统之间的细节会有所不同,但在大多数情况下,如果您的线程具有足够高的优先级,它将在准备好运行时立即被调度,并会抢占所有其他优先级较低的线程,直到完成。例如,在 Linux 上,这可以通过 SCHED_RR 优先级类来完成。但是,这在许多情况下会对性能产生负面影响;如果您的线程进入无限循环,还会使系统崩溃。使用这些调度类通常还需要管理权限。

也就是说,如果调度花费的时间足够长以至于客户端超时,您可能会遇到其他一些负载问题。您还应该真正确定响应速度需要多快 - 如果您想加快响应速度,您可以做的事情没有尽头,但是到了一个不再重要的地步(你需要几十毫秒?个位数毫秒?几百微秒?个位数微秒?)。

【讨论】:

    【解决方案2】:

    没有可以立即唤醒线程的同步机制。当一个线程正在等待的同步机制被发出信号时,该线程被放置在它的优先级的就绪队列中。它可以在计划之前在那里饿几秒钟(Windows 确实有处理 3-4 秒间隔内的饥饿的机制)。

    我认为对于带外的关键通信,您可以拥有更高优先级的线程,您可以将回复消息排入队列并唤醒它(使用条件变量、MRE 或任何其他同步机制)。如果该线程的优先级高于应用程序的其他线程,唤醒它会立即影响上下文切换。

    【讨论】:

      猜你喜欢
      • 2014-11-18
      • 2016-10-16
      • 2015-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-26
      • 1970-01-01
      相关资源
      最近更新 更多