【发布时间】: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