并发执行/重入/线程安全/?

时间:2010-01-26 18:16:29

标签: multithreading reentrancy

我在这里阅读了很多关于线程安全,重新入侵的问题的答案,但是当我想到它们时,脑海中浮现出一些问题,因此这个问题就出现了。

1。)我有一个可执行程序说一些* .exe。如果我在命令提示符下运行该程序,并且在执行时,我在另一个命令提示符下运行相同的程序,然后在什么条件下结果可能被破坏,即该程序的代码是否应该是重入的或者它应该是线程安全吗?

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

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

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

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

感谢,

-AD。

3 个答案:

答案 0 :(得分:1)

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

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

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

  3. 两个线程经常执行相同的代码。在线程化时,有两种不同的概念方法来分配你的工作。您可以根据任务进行思考 - 即:一个线程执行任务A而另一个线程执行任务B.或者,您可以考虑根据数据分解问题。在这种情况下,您使用大型集合,并使用相同的例程处理每个元素,但处理并行进行。有关详细信息,请阅读我在Decomposition for Parallelism上撰写的此博文。

答案 1 :(得分:0)

  1. 两个进程无法共享内存。所以线程安全在这里没有实际意义。

  2. Re-entrancy意味着一个方法可以由两个线程同时安全地执行。这不需要递归 - 线程是单独的执行单元,并且没有什么能阻止它们同时尝试运行相同的方法。

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

答案 2 :(得分:0)

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

有关

1)和2)已经回答了。

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

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

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