代码之家  ›  专栏  ›  技术社区  ›  Julien Lebosquain

基于消息的多线程或线程池的一个简短和不寻常的行动?

  •  2
  • Julien Lebosquain  · 技术社区  · 15 年前

    我目前正在.NET中使用Retlang进行基于消息的多线程处理,这是一个很棒的库。我已经没有显式锁了,每个线程都在做自己的事情,管理应用程序的一部分,并通过消息与其他线程通信。

    所以我开始怀疑99.9%的睡眠时间是不是一个好的选择。这种操作有线程池,但是由于我无法控制接收消息的线程,所以我不得不使用难看的、容易出错的锁。

    我的问题是:在资源方面,让线程空闲,等待绝大多数时间,这真的是一个问题吗?在使用好的基于消息的体系结构之后使用共享多线程,感觉就像回到了过去,而且它将是应用程序中唯一具有锁的部分。但我一直在想“我在这里做错什么了吗?”用这条线。

    编辑

    7 回复  |  直到 15 年前
        1
  •  3
  •   Reed Copsey    15 年前

    实际上,我认为,对于大多数时间处于休眠状态的线程,使用线程池是一个糟糕的设计选择-

    让一个线程休眠(或者更好地说,等待事件)在应用程序中的开销非常小。使用专用线程的主要缺点是线程需要分配自己的堆栈,因此与线程池线程相比,您将使用一点额外的内存。

        2
  •  2
  •   Stephen Cleary    15 年前

    这听起来像是使用 Task

        3
  •  1
  •   Ronald Wildenberg    15 年前

    你不能用瑞特朗的吗 PoolFiber 为了这个?它不是由像这样的专用线程支持的 ThreadFiber 而是通过.Net线程池。这意味着您可以在整个应用程序中使用相同的Retlang语义,而无需保留空闲线程。

        4
  •  1
  •   gnash    15 年前

        5
  •  0
  •   C. Ross trotttrotttrott    15 年前

    我认为这基本上是一个优化的问题。您的应用程序是否有性能问题(特别是内存问题)?如果没有,那么继续让线程保持空闲并保持代码更干净。一旦你有了真正的理由,就去探索其他的选择。

        6
  •  0
  •   Brian Gideon    15 年前

    我想说,有一个专门的线程接收这些消息很好。我甚至可以说,这将是首选的方法。这并不是说你只是随意地创建线程或者诸如此类的东西。我们在这里讨论的是一个额外的线程,它不会消耗很多资源(可能有一点堆栈空间)。在我看来,不必担心共享状态的额外同步(当然除了消息传递之外)的优点胜过缺点。

        7
  •  0
  •   Brian    15 年前

    你应该考虑使用F。它非常适合在不烧录线程的情况下对逻辑单线程代理进行编程(例如,代理可以在线程池中跳跃,但仍然以序列化方式响应消息,到达其邮箱的消息会唤醒它们并安排线程池的工作)。

    http://blogs.msdn.com/b/dsyme/archive/2010/02/15/async-and-parallel-design-patterns-in-f-part-3-agents.aspx