何时选择多线程或多进程?

12

我从来没有进行过并发编程,了解它们的知识都是来自操作系统书籍。

今天在面试中遇到了这个问题。我想知道有没有人能够直观地解释一下多线程和多进程以及何时选择它们。或者,您可以为我推荐一些带有实际示例的书籍或链接。我想阅读带有并发编程的开源项目(c / c ++)的源代码,希望您能推荐一个。

非常感谢您的任何帮助。


由于核心问题更具概念性,因此应该在http://programmers.stackexchange.com/上提问。另一方面,在这里和那里都不允许要求代码或离线资源。 - Some programmer dude
我会在programmers.stackexchange.com上询问。我并不是要求代码。我所说的开源项目是指任何已知的项目,我们可以在sourceforge、github和其他开源网站上轻松找到。提供一个链接或项目名称即可。 - slee
1个回答

16

多线程:

  • 执行在线程之间进行;在某些操作系统上,这些线程比进程更轻量级;而在Linux上,则是使用相同的数据结构来内部实现它们。
  • 线程共享内存,因此必须通过互斥机制(例如信号量、互斥量、条件变量等)保护全局共享数据结构。
  • 在Linux上,pthread库(代表“POSIX线程”)提供用户级别的多线程支持;使用pthread_create()创建线程;通过使用-pthread选项编译普通的C/C++程序即可使用此库。

多进程:

  • 执行在进程之间分割。
  • 传统上,进程不共享内存;但在Linux上,进程也可以通过适当的系统调用共享内存。
  • 在POSIX系统上(例如Linux),进程通过fork()系统调用创建:一个进程(称为“父进程”)可以创建(“派生”)另一个进程(称为“子进程”)。C/C++程序无需链接到任何外部库即可调用fork()。
  • 数据通常通过消息传递机制(例如管道、FIFO和套接字)交换。

使用多线程或多进程的决定通常取决于两个因素:

  1. 如果需要在不同执行实体之间共享数据。消息传递机制比共享内存更慢、不够灵活。因此,在某些情况下,使用线程而不是进程更好。
  2. 可靠性:多进程应用程序通常更可靠,因为一个进程的崩溃不会影响其他进程。

最后注意一点:非常复杂的应用程序可以同时具有多线程和多进程来完成软件特定部分的需求。


我想知道“Unix哲学”对这个主题有何看法。我可以看到它建议您利用管道和中间文件作为进程间通信手段,并避免线程程序的多重责任功能。 - Sridhar Sarnobat

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