【问题标题】:when and how is memory separate in c++ multithreading?c++ 多线程中的内存何时以及如何分离?
【发布时间】:2021-12-24 05:05:30
【问题描述】:

在多线程中(例如 std::thread),进程内存在线程之间共享。但是,这是否扩展到使用两个不同参数调用的函数?

一个愚蠢的例子:

int add_two_in_ridiculous_fashion(int x) {
    x++;
    std::this_thread::sleep(1s);
    x++;
    return x;
}

当线程处于休眠状态时,另一个线程进入并将 x 替换为不同的值,两个线程分别返回后者的值 + 1 和 + 2。这可能吗?

如果是,是否有在 C++ 中防止这种情况的无锁方法?

【问题讨论】:

  • 不,这不会发生,使用显示的代码。谢天谢地,C++ 不是这样工作的。
  • 局部变量,包括函数参数,是本地的,线程之间不共享。这是通过为每个线程的堆栈分配一个单独的内存区域来实现的。您的函数将在每个实例中返回 x+2
  • 我认为这个问题背后的真正问题是“什么是堆栈变量?”这篇文章似乎假设对堆栈上的变量存在误解。
  • “进程内存是共享的”:您应该了解进程使用的不同内存块以及它们是否共享。
  • 我可以看到这在一些不使用受保护内存的粗略操作系统上是可能的,其中一个线程甚至可以覆盖另一个线程的堆栈内存而不会产生段错误。我认为在很大程度上要简化,答案是否定的。我很难简化沟通,试图解释每一种可能的情况,无论多么模糊和不可能。

标签: c++ multithreading parallel-processing


【解决方案1】:

不,这不会导致任何问题。每个线程都有自己的堆栈,并且局部变量和参数(在您的情况下为 x)在堆栈上,因此对于每个线程都是分开的。一个类的成员变量或全局变量在不同的线程之间共享(对于同一个对象实例)。

【讨论】:

  • “类 [...] 的成员变量是共享的”:并非总是如此。
  • @pasabaporaqui 是的,有一些方法可以实现线程之间的分离,但这可能超出了这个问题。
【解决方案2】:

具有自动存储功能的变量 - 例如参数 x - 每次进入其范围时都是不同的 - 在这种情况下是每次调用函数时。

当函数调用来自不同的线程时是这样,而且当函数从同一个线程重新进入时也是如此,这可能会在存在递归或异步信号的情况下发生。

当线程处于休眠状态时,另一个线程进入并将 x 替换为不同的值,两个线程分别返回后者的值 + 1 和 + 2。这可能吗?

这是不可能的,因为每个 x 都是一个不同的对象。

c++ 多线程中何时以及如何分离内存?

整个内存空间由所有线程共享。

但是变量是否命名同一个对象是另一回事。正如我前面提到的,每次输入它们的范围时,自动变量都是不同的。线程局部变量在每个线程中命名一个不同的对象。静态变量在所有线程中命名相同的对象,并且很容易受到多线程错误的影响。

【讨论】:

    猜你喜欢
    • 2012-01-07
    • 2012-11-28
    • 2014-06-21
    • 2010-09-13
    • 2011-06-15
    • 2021-11-18
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多