【问题标题】:Threads/Process comparison on Linux/WindowsLinux/Windows 上的线程/进程比较
【发布时间】:2012-03-20 06:03:24
【问题描述】:

我有一些在 Windows 中使用线程和进程的经验。

有人可以解释一下,Windows中的线程和进程是否可以映射到Linux中的相同?

也就是说,Windows 中的线程 == Linux 中的线程? -> 有什么意义吗? Windows 中的进程 == Linus 中的进程? -> 有意义吗?

如果相同,我在 windows 中有 CreateThread() 和 CreateProcess() 调用,linux 中的等效调用是什么?

我已经阅读了 SO 中的一些帖子,但其中大多数都没有消除我的疑问。所以想开始一个新帖子。

如果我能通过一些简单的示例(C 编程)得到一些解释,那就太好了。

【问题讨论】:

  • 在 Linux 中查找 pthread_createfork 调用。
  • 不要期望 Linux 和 Windows 系统调用之间存在等价关系。概念和术语略有不同。
  • 好吧,严格来说,Linux 根本没有线程,它只知道进程,并且最近知道共享地址空间和/或文件描述符的进程。此外,它永远不会创建新流程,它只会复制它们。就目前而言,即使可以实现相似或相同的最终结果,也没有真正的 1:1 对应关系。

标签: c windows linux multithreading process


【解决方案1】:

嗯,在 Linux 中也有针对您的用途的等效调用,但它们的工作方式略有不同,至少对于进程机制而言。

  1. 对于线程,您可以使用pthread_create。它的工作方式与CreateThread 非常相似,除了一些参数不同。应该很容易使用。这是一个很好的教程:https://computing.llnl.gov/tutorials/pthreads/

  2. 模拟CreateProcess 以启动外部进程并不是那么简单。您将需要著名的fork/exec 组合。首先,您需要在主进程中调用fork 来生成一个子进程。这个孩子是通过复制初始过程来创建的。然后您可以通过检查fork返回的值来控制流程:

 int rv = fork(); 
 // new process was spawned here. The following code is executed 
 // by both processes.
 if(rv == 0)
 {
     // we are in the child process
 }
 else
 {
     // we are in the parent
 }

基本上rv 将是 0 对于孩子和父母的孩子的 pid。我希望到目前为止我还没有失去你。 :)

接下来,您需要调用 exec 系列函数之一来启动外部进程:

 int rv = fork(); 
 // new process was spawned here. The following code is executed 
 // by both processes.
 if(rv == 0)
 {
     execl("/bin/ls", "ls", NULL); // start the ls process
 }
 else
 {
     // we are in the parent
 }

在上面的例子中,我正在启动/bin/ls 外部进程,它打印当前文件夹的内容。

这是一个简单的完整示例:http://flinflon.brandonu.ca/dueck/2001/62306/Processes/Unix%20Examples.htm

现在您可能想知道为什么首先需要致电 fork 以及为什么 execl 还不够。这是因为execl调用的程序终止后,当前进程也终止了,你不希望在主进程中发生这种情况。

【讨论】:

  • :一旦返回fork()就不可能开始新进程。我的意思是我们不需要在fork()之后执行下一行,如果我们可以将可执行文件传递给作为 fork 的一部分产生的,这与 windows 中的 createProcess 一样合乎逻辑吗?
  • @Renjith G:恐怕不会。 fork 不带任何参数。它的唯一目的是将当前进程复制到一个新进程中。 fork/exec 是启动外部进程的标准 linux 方式。
  • 酷,新的fork进程有了新的PID吧?子进程和父进程的线程ID是一样的吗?
  • 另外,我认为 linux 中的线程编程比进程编程更受欢迎,不是吗?这就是我在线程编程中看到的比其他更多的输入
  • 现代 Linux 支持的 posix_spawn() function 更接近于 CreateProcess()
猜你喜欢
  • 2011-03-09
  • 1970-01-01
  • 2018-12-15
  • 1970-01-01
  • 2014-08-30
  • 2020-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多