1

我在这里阅读了许多与线程安全、重入相关的问题的答案,但是当我想到它们时,我想到了更多的问题,因此这个问题。

1.) 我有一个可执行程序说一些 *.exe。如果我在命令提示符下运行这个程序,并且在它执行时,我在另一个命令提示符下运行相同的程序,那么在什么情况下结果可能会被破坏,即这个程序的代码应该是可重入的还是应该是单独线程安全?

2.) 在定义重入的时候,我们说例程可以在已经运行的时候重新进入,在什么情况下可以重新进入函数(除了是递归例程,我这里不是说递归执行) . 必须有某个线程才能再次执行相同的代码,或者如何再次输入该函数?

3.) 在实际情况下,两个线程是否会执行相同的代码,即执行相同的功能。我认为多线程的想法是同时执行不同的功能(在不同的内核/处理器上)。

抱歉,如果这些查询看起来不同,但它们都发生在我身上,同时我在 SO 上阅读了有关线程安全 Vs 可重入的帖子,因此我将它们放在一起。

任何指针,阅读材料将不胜感激。

谢谢,

-广告。

4

3 回答 3

1

我将尝试按顺序解释这些:

  1. 每个程序都在自己的进程中运行,并获得自己独立的内存空间。在这种情况下,您不必担心线程安全。(但是,如果进程都在访问其他共享资源,例如文件,则可能会遇到不同的问题。例如,进程 1 可能会“锁定”数据文件,从而阻止进程 2 打开它)。

  2. 这里的想法是两个线程可能会尝试同时运行相同的例程。这并不总是有效的——它需要特别注意以多个线程可以使用同一个类的同一个实例或同一个静态函数的方式定义一个类或一个进程,而不会发生错误。这通常需要类中的同步。

  3. 两个线程经常执行相同的代码。线程化时有两种不同的概念方式来划分您的工作。您可以从任务的角度思考——即:一个线程执行任务 A,而另一个线程执行任务 B。或者,您可以根据数据分解问题来思考。在这种情况下,您使用的是一个大型集合,并且每个元素都使用相同的例程进行处理,但处理是并行进行的。有关更多信息,您可以阅读我在Decomposition for Parallelism上写的这篇博文。

于 2010-01-26T18:22:53.620 回答
0
  1. 两个进程不能共享内存。所以线程安全在这里没有实际意义。

  2. 重入意味着一个方法可以被两个线程同时安全地执行。这不需要递归——线程是独立的执行单元,没有什么可以阻止它们同时尝试运行相同的方法。

  3. 线程的好处可以通过两种方式实现。一种是同时执行不同类型的操作(例如同时运行 CPU 密集型代码和 I/O 密集型代码)。另一种是您可以在多个处理器之间划分长时间运行的操作。在后一种情况下,两个线程可能同时在不同的输入数据集上执行相同的功能。

于 2010-01-26T18:22:15.587 回答
0

首先,我强烈建议你看一些计算机系统的基本知识,特别是进程/线程是如何在 CPU 上执行以及如何被操作系统调度的。例如,虚拟地址、上下文切换、进程/线程概念(例如,每个线程都有自己的堆栈和寄存器向量,而堆由线程共享。线程是一个执行和调度单元,因此它维护代码的控制流.. ) 等等。所有问题都与了解您的程序如何在 CPU 上实际工作有关

1) 和 2) 已经回答。

3)多线程只是任意线程的并发执行。相同的代码可以被多个线程执行。这些线程可以共享一些数据,甚至可以进行很难找到的数据竞争。当然,很多时候线程都在执行单独的代码(我们称之为线程级并行)。

在这种情况下,我将并发用作两个含义:(a)在单个处理器中,多个线程共享单个物理处理器,但操作系统给人一种线程在并发运行的错觉。(b) 在多核中,是的,物理上可以同时执行两个或多个线程。

对并发/并行执行有具体的理解需要相当长的时间。但是,你已经有了深刻的理解!

于 2010-01-26T19:03:05.163 回答