在最近的一次“技术讨论”中,我被问到“你怎么用单线程完成多线程?”在确认面试官不认为这是一个诡计问题后,我不得不承认我没有一个好的想法如何在单线程上实现多线程,而且,我认为这个问题有点矛盾。面试官提供的答案是“通过使用多播委托”,让我想知道他是否真的不懂委托和底层线程。我很想知道这个问题是否有任何价值,更重要的是,如果相关答案有意义。谢谢。如何使用单个线程完成多线程?
回答
协程是模拟协作多线程(不支持.NET,除非我们认为async
/await
模式是协程模式)。
异步编程模拟多线程(至少部分是......多个读/写例如同时执行)......两者都是隐藏“线程”部分的可能解决方案。
详细阐述异步编程...可以构建一个完整的Web服务器,能够基于单线程+异步细化同时响应数百个请求。从磁盘读取的每个数据都将异步完成。对连接客户端的每个响应都将以异步方式完成,依此类推。
赋予一个名字,从我理解,Node.js的是完全基于异步编程单线程Web服务器(技术上称为非阻塞I/O)...查看例如https://stackoverflow.com/a/14797359/613130
要什么我写过,我会补充说有一些语言实现了所谓的Green threads。绿线程是不使用OS调度程序的协作线程。他们的代码在一个线程中执行(至少从他们的角度来看)。看来,Go,haskell,老Ruby,各种版本的Smalltalk都使用/使用绿色线程)。
异步!=多线程。主要的区别在于,对于异步代码,它只能一次性运行整个代码块,并且只能在另一个完整块完成时交换出代码的其他部分。在多线程环境中,它可以暂停堆栈的执行,将其与另一个上下文互换,然后返回到上一个上下文。我看不出C#如何实现这一点;如果没有线程的帮助,它的水平太高了。 – Servy
@Servy我的意思是,从外部观察者的角度来看,异步==多线程:同时可以由Node.js处理多个请求。事实上,异步类似于多线程,因为您将操作留给将在其一个线程上执行的操作系统。因此,不是在流程内部进行多线程,而是跨整个流程和操作系统进行多线程。是的,它在4中分裂了众所周知的纤维,但问题是一个半问题,至少需要一点侧面思考。 – xanatos
但事实是,这不是多线程。这可能意味着提出问题的人实际上意味着“异步”而不是“多线程”。如果他们这样做了,那么这将是一个答案。 – Servy
- 1. 哪个线程完成多线程?
- 2. 如何等候多个线程完成?
- 3. 斯卡拉 - 多线程,当任何子线程完成时完成主线程
- 4. Java多线程等待线程完成
- 5. 如何使线程等到另一个线程完成启动
- 6. 如何使用线程完成,然后重用线程?
- 7. 单线程执行完成
- 8. Nd4j:使用多线程比单线程
- 9. 如何检查每个线程是否完成或不在多个线程中?
- 10. 主线程等待多个backgroundworker线程来完成
- 11. 如何等待线程直到另一个线程完成
- 12. C#等待多个线程完成
- 13. 如何使父线程等待子线程完成 - C#
- 14. 如何确定完成哪个线程
- 15. 如何等待一个线程完成
- 16. 多线程使用线程池一个for循环中完成的工作
- 17. C#多线程在任何其他线程完成后添加线程
- 18. C++ 11个线程:如何启动线程,并单独检查其完成?
- 19. 使用单个(额外)线程的多线程编程
- 20. 多线程程序中完成线程的实时输出(CompletionService)
- 21. 如何在多线程生产者 - 使用者模式下完成工作线程后退出工作线程?
- 22. 单线程C多线程#
- 23. 多线程vs单线程
- 24. 线程 - 确保线程完成在C#
- 25. 线程完成时通知主线程
- 26. 如何使用多线程来有效地使用多线程
- 27. java编程和java单线程多线程问题(单线程与多线程)
- 28. 如何使用多线程
- 29. 如何使用多线程
- 30. 如何使用多线程
* trick trick *,but :)。 –
是;他不知道他在说什么。正确的答案是纤维。 – SLaks
@SLaks我会说这仍然不是多线程。 – hvd