2013-08-16 60 views
6

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

+2

* trick trick *,but :)。 –

+2

是;他不知道他在说什么。正确的答案是纤维。 – SLaks

+3

@SLaks我会说这仍然不是多线程。 – hvd

回答

4

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

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

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

赋予一个名字,从我理解,Node.js的是完全基于异步编程单线程Web服务器(技术上称为非阻塞I/O)...查看例如https://stackoverflow.com/a/14797359/613130

要什么我写过,我会补充说有一些语言实现了所谓的Green threads。绿线程是不使用OS调度程序的协作线程。他们的代码在一个线程中执行(至少从他们的角度来看)。看来,Go,haskell,老Ruby,各种版本的Smalltalk都使用/使用绿色线程)。

+1

异步!=多线程。主要的区别在于,对于异步代码,它只能一次性运行整个代码块,并且只能在另一个完整块完成时交换出代码的其他部分。在多线程环境中,它可以暂停堆栈的执行,将其与另一个上下文互换,然后返回到上一个上下文。我看不出C#如何实现这一点;如果没有线程的帮助,它的水平太高了。 – Servy

+1

@Servy我的意思是,从外部观察者的角度来看,异步==多线程:同时可以由Node.js处理多个请求。事实上,异步类似于多线程,因为您将操作留给将在其一个线程上执行的操作系统。因此,不是在流程内部进行多线程,而是跨整个流程和操作系统进行多线程。是的,它在4中分裂了众所周知的纤维,但问题是一个半问题,至少需要一点侧面思考。 – xanatos

+1

但事实是,这不是多线程。这可能意味着提出问题的人实际上意味着“异步”而不是“多线程”。如果他们这样做了,那么这将是一个答案。 – Servy