【问题标题】:Asynchronous I/O and time consuming work异步 I/O 和耗时的工作
【发布时间】:2014-10-25 16:59:56
【问题描述】:

我知道异步套接字编程比同步更具可扩展性。

但有一点我不太明白:

如果您的事件循环应该是非阻塞的,您如何将耗时的工作委托给另一个线程而不阻塞?工作队列通常需要一个互斥体来保护。我知道有无锁队列,但这是如何完成的?有人可以给这个东西一点概念吗?

【问题讨论】:

  • 您只需将长工作拆分为一系列短 sn-ps。阅读CPS,这可能会提供理论见解。
  • @BasileStarynkevitch 究竟是如何解决问题的?
  • 将上下文数据排队到另一个线程/池中。完成后再次将其重新排队,以便为它触发回调并与之一起触发。 ASIO 不好玩吗:)
  • @MartinJames 但这需要互斥体,不是吗?
  • @HansPassant 我的问题是:事件循环应该是非阻塞的,但是任务队列需要互斥体,所以它有可能会阻塞事件循环,这很糟糕。

标签: c sockets asynchronous tcp kqueue


【解决方案1】:

工作线程一直从队列块中拉出。当队列为空时,他们必须这样做。他们还应该做什么?

这是不应该阻塞的工作项,因此我们只需要几个队列工作线程。

异步 ​​IO 是关于使用更少的线程。

如果你的事件循环应该是非阻塞的

这个假设是错误的。它不应该不阻塞。循环始终包含阻塞。每次队列为空且工作人员尝试出队时。

【讨论】:

  • 事件循环在一个或多个工作线程上运行。究竟是什么没有回答?
  • 我被教导应该只从 kqueue 中拉出一个线程,或者线程池和 kqueue 的混合。
  • 如果你愿意,你可以用一个线程来完成。答案仍然完全适用。究竟是什么没有回答?这里一定有什么误会,需要大家配合才能找到。
  • 我不知道如何在不阻塞事件循环的情况下将工作从事件循环委托给另一个线程(如果我只有一个事件循环)。我非常不确定异步 tcp 服务器在概念上的样子。
  • 如果工作项没有阻塞,事件循环是有意义的。如果一个工作项想要执行一个 IO 操作,它会启动该操作并在 IO 完成时使操作队列成为另一个工作项。旧工作项返回。当 IO 处于运行状态时,根本没有工作项正在运行或排队(与该 IO 相关)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-14
  • 2011-03-14
相关资源
最近更新 更多