将程序的不同部分分成不同的过程似乎(对我而言)制作一个更优雅的程序,而不仅仅是线程化所有东西.在什么情况下,让事情在线程上运行而不是将程序分成不同的进程是有意义的?我什么时候应该使用线程?
关于它们如何(或者如果)对单核和多核采取不同行为的任何事情也会有所帮助.
您更喜欢多个进程的多个线程有两个原因:
与进程间通信相比,线程间通信(共享数据等)的编程要简单得多.
线程之间的上下文切换比进程之间的快.也就是说,操作系统停止一个线程并开始运行另一个线程比使用两个进程执行相同操作更快.
例:
使用GUI的应用程序通常使用一个线程用于GUI,其他用于后台计算.例如,MS Office中的拼写检查程序是一个与运行Office用户界面的线程不同的线程.在这样的应用程序中,使用多个进程会导致性能降低,代码难以编写和维护.
除了使用线程过程的优点之外,例如:
好处:
创建线程比处理更快.
在线程之间切换比在进程之间切换要快得多.
线程轻松共享数据
考虑一些缺点:
线程之间没有安全性.
一个线程可以踩踏另一个线程的数据.
如果一个线程阻塞,则任务块中的所有线程.
关于你的问题的重要部分"我什么时候应该使用一个线程?"
那么你应该考虑一些线程不应该改变程序语义的事实.他们只是改变了操作的时间.因此,它们几乎总是被用作与性能相关的问题的优雅解决方案.以下是您可能使用线程的一些示例:
进行冗长的处理:当Windows应用程序正在计算时,它不能再处理任何消息.结果,无法更新显示.
进行后台处理:某些任务可能不是时间关键,但需要连续执行.
执行I/O工作:磁盘或网络的I/O可能会出现不可预测的延迟.线程允许您确保I/O延迟不会延迟应用程序的不相关部分.
我假设你已经知道你需要一个线程或一个进程,所以我认为选择一个而不是另一个的主要原因是数据共享.
使用流程意味着您还需要进程间通信(IPC)来获取进出流程的数据.如果要隔离这个过程,这是一件好事.
你肯定听起来不像新手.这是一个很好的观察,在许多方面,流程更优雅.线程基本上是一种优化,以避免过多的转换或内存空间之间的过多通信.
表面上使用线程似乎也可以使您的程序更容易读写,因为您可以自由地在线程之间共享变量和内存.在实践中,这样做需要非常小心,以避免竞争条件或死锁.
有一些操作系统内核(最着名的是L4)非常努力地提高进程间通信的效率.对于这样的系统,人们可能会提出一个令人信服的论点,即线程毫无意义.