访问其他线程堆栈变量如何在C++中工作?
How does access other thread stack variable work in C++?
例如,我有:
int main()
{
int i = 0;
std::thread t([&] {
for (int c = 0; c < 100; ++c)
++i;
});
t.join();
return 0;
}
线程t
更改变量i
值。 我认为,当操作系统更改当前线程时,它必须保存旧的线程堆栈并复制新的线程堆栈。
操作系统如何提供对i
的正确访问? 它是否存在任何解释,它如何在操作系统级别工作?
如果我使用以下东西,它会更有效率吗:
int main()
{
int* i = new int;
std::thread t([&] {
for (int c = 0; c < 100; ++c)
++(*i);
});
t.join();
return 0;
}
示例代码中有两个独立的东西在起作用:将局部变量捕获到 lambda 函数以及线程及其堆栈的工作方式。
创建 lambda 函数时捕获局部变量的工作方式相同,无论 lambda 是在同一线程中还是在不同的线程中。基本上,对变量的引用被传递给 lambda。 请参阅如何表示和传递 C++11 lambda?了解更多详情。
正如 Margaret Bloom 所评论的那样,线程共享进程的地址空间。它们允许读取和修改相同的内存(包括例如全局变量)。虽然每个线程都分配了不同的堆栈区域,但堆栈都在进程的地址空间中,因此所有线程都可以访问其他线程的堆栈区域。因此,如果一个线程有一个指针或对另一个线程堆栈中的变量的引用,它可以读取和修改它。
将这两件事加在一起会使您的示例代码正常工作。
代码的第一个版本可能效率略高,因为间接寻址级别少了一个。
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 链表c++插入,所有情况都已检查,但没有任何工作
- 为什么stream::忽略未按预期工作