【问题标题】:how do you accomplish multithreading using a single thread?如何使用单线程完成多线程?
【发布时间】:2013-08-16 14:56:47
【问题描述】:

在最近的一次“技术讨论”中,有人问我“如何使用单线程实现多线程?”在确认面试官不认为这是一个棘手的问题后,我不得不承认我对如何在单线程上实现多线程并没有很好的想法,而且我认为这个问题有点矛盾。面试官提供的答案是“通过使用多播委托”,这让我想知道他是否真的不了解委托和底层线程。我很想知道这个问题是否有任何价值,更重要的是,相关的答案是否有意义。谢谢。

【问题讨论】:

  • 技巧问题,不过:)。
  • 是的;他不知道他在说什么。正确答案是纤维。
  • @SLaks 我想说那仍然不是多线程。
  • @hvd:为什么不呢? (或者,更一般地说,用户模式调度程序)
  • 正确的回应是向他解释多播委托是按顺序执行的。

标签: c# .net multithreading delegates


【解决方案1】:

协程是为了模拟协作多线程(.NET 不支持,除非我们将async/await 模式视为协程模式)。

异步编程模拟多线程(至少部分...例如同时执行多个读/写)...两者都是隐藏“线程”部分的可能解决方案。

详细说一下异步编程... 一个可以建立一个完整的Web服务器,能够同时响应数百个请求,基于单线程+异步阐述。每次从磁盘读取都将异步完成。对连接客户端的每个响应都将异步完成,依此类推。

给个名字,据我了解,node.js 是一个完全基于异步编程(技术上称为非阻塞 I/O)的单线程 Web 服务器...例如见 https://stackoverflow.com/a/14797359/613130

对于我所写的内容,我将补充一点,有些语言实现了所谓的Green threads。绿色线程是不使用 OS 调度程序的协作线程。他们的代码因此在单个线程中执行(至少从他们的角度来看)。似乎 Go、haskell、旧 Ruby、各种版本的 Smalltalk 都使用/使用了绿色线程。

【讨论】:

  • 异步 != 多线程。主要区别在于,对于异步代码,它只能一次运行整个代码“块”,并且只能在另一个完整块完成时交换到其他代码部分。在多线程环境中,它可以暂停堆栈的执行,将其与另一个上下文交换,然后返回到前一个上下文。我看不出 C# 是如何做到这一点的。如果没有线程的帮助,它的级别太高了。
  • @Servy 我的意思是,从外部观察者的角度来看,异步 == 多线程:Node.js 可以同时处理多个请求。事实上,异步类似于多线程,因为您将操作留给将在其线程之一上执行它的操作系统。因此,它不是在进程“内部”进行多线程,而是在“跨进程和操作系统”进行多线程。是的,它把众所周知的纤维一分为二,但这个问题是一个半技巧问题,至少需要一点横向思考。
  • 但事实仍然是这不是多线程。这可能意味着提出问题的人实际上是指“异步”而不是“多线程”。如果他们这样做了,那么这将是一个答案。
  • 总而言之,如果问题是要询问多线程的异步性质,那么多播委托将是一个可以接受的解决方案。另一方面,如果问题真的是试图同时解决异步和并发多线程,那么确实没有实用的“单线程上的多线程”.Net 解决方案。谢谢。
  • @adkSerenity 不,Multicast Delegate 甚至不是异步解决方案。或者至少我不会那样定义它。它不再比委托列表异步。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-25
  • 1970-01-01
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多