如何使用单个线程实现多线程?

6
在最近的“技术讨论”中,有人问我“你如何使用一个线程来实现多线程?”确认面试官不认为这是一个恶作剧后,我不得不承认我不知道如何在一个线程上实现多线程,并且进一步认为这个问题有些矛盾。面试官给出的答案是“通过使用多路广播委托”,让我想知道他是否真正理解了委托和底层线程。我很想知道这个问题是否有任何价值,更重要的是,相关答案是否有任何意义。谢谢。

2
“恶作剧问题”,不过这只是个玩笑 :)。 - cuongle
2
是的,他根本不知道自己在说什么。正确答案是纤程。 - SLaks
3
我会尽力为您翻译:我觉得那仍然不算多线程。 - user743382
@hvd:为什么不呢?(或者更普遍地说,用户模式调度程序) - SLaks
3
正确的回答是向他解释多播委托按顺序执行。 - SLaks
显示剩余5条评论
1个回答

4

协程是一种用于模拟协作式多线程的方法(.NET不支持,除非我们将async/await模式视为协程模式)。

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

为了详细说明异步编程...可以基于单个线程+异步处理构建一个完整的Web服务器,能够同时响应数百个请求。每次从磁盘读取都将以异步方式完成。每个连接客户端的响应都将以异步方式完成,等等。

就我所理解的而言,node.js是一个完全基于异步编程(技术上称为非阻塞I/O)的单线程Web服务器...请参见https://dev59.com/dGUq5IYBdhLWcg3wF8nw#14797359

关于我所写的内容,我要补充一点,有些编程语言实现了所谓的Green threads。Green threads是一种不使用操作系统调度程序的协作线程。它们的代码在单个线程中执行(至少从它们的角度来看是这样)。似乎Go、Haskell、旧版Ruby和各种版本的Smalltalk都使用/曾经使用过green threads。


1
异步不等于多线程。它们的主要区别在于,对于异步代码,它只能一次性运行一个完整的“块”代码,只有当另一个完整的代码块完成时,才能切换到其他部分的代码。在多线程环境中,它可以暂停堆栈的执行,将其与另一个上下文交换,然后返回先前的上下文。我看不出C#如何能够做到这一点;它需要线程的帮助才能实现。 - Servy
1
@Servy 我的意思是从外部观察者的角度来看,异步 == 多线程:Node.js 可以同时处理多个请求。实际上,异步与多线程类似,因为您将操作留给操作系统,在其线程之一上执行它。因此,它不是在进程“内部”进行多线程处理,而是在进程和操作系统“跨越”进行多线程处理。是的,它将谚语中的纤维分成4份,但问题是一个半诡计性问题,需要至少有一点侧面思考。 - xanatos
1
但事实仍然是这不是多线程。这可能意味着提问者实际上是指“异步”而不是“多线程”。如果是这样,那么这就是一个答案。 - Servy
总之,如果问题是关于多线程异步性质的,那么多播委托将是一个可接受的解决方案。另一方面,如果问题真正想要解决异步和并发多线程,那么在单个线程上实现“多线程”并不现实,.Net也没有相应的解决方案。谢谢。 - Seymour
1
@adkSerenity 不,多播委托甚至不是异步解决方案。或者至少我不会这样定义它。它并不比委托列表更异步。 - xanatos
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接