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

问题描述 投票:0回答:3

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

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

2.)在定义可重入性时,我们说例程可以在运行时重新进入,什么情况下可以重新进入函数(除了递归例程之外,这里不是说递归执行)。必须有某个线程再次执行相同的代码,否则如何再次进入该函数?

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

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

任何指点、阅读材料将不胜感激。

谢谢,

-AD。

multithreading reentrancy
3个回答
1
投票

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

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

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

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


0
投票
  1. 两个进程不能共享内存。所以线程安全在这里没有意义。

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

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


0
投票

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

有关

1) 和 2) 已经回答了。

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

在这种情况下,我使用“并发”有两个含义:(a)在单个处理器中,多个线程共享单个物理处理器,但操作系统给出了一种线程同时运行的错觉。 (b) 在多核中,是的,物理上两个或多个线程可以同时执行。 对并发/并行执行有具体的了解需要相当长的时间。但是,你已经有了扎实的了解!

© www.soinside.com 2019 - 2024. All rights reserved.