【发布时间】:2019-04-27 22:03:39
【问题描述】:
我偶然发现了这个问题:Thread access to stack of another thread。链接的问题是关于纯 C 的,但我的主要语言是 C++,所以我试图找出相同的规则是否适用于 C++。
我在 C11 草案N1570 中找到了这一部分:
6.2.4.5 其标识符声明为无链接且无链接的对象 存储类说明符 static 具有自动存储持续时间,如 做一些复合文字。试图间接的结果 从其他线程访问具有自动存储持续时间的对象 比与对象关联的对象是 实现定义。
我相信 C++20 草案 N4810 的相应部分是 [basic.stc.auto],它没有提到这种情况。 C++11 草案在这部分的文字与 C++20 完全相同。
在[intro.multithread]下我找到了这句话带脚注:
程序中的每个线程都可能访问程序中的每个对象和函数。
具有自动或线程存储持续时间 (6.6.5) 的对象是 与一个特定线程相关联,并且可以由 不同的线程只能通过指针或引用间接 (6.7.2)。
所以我假设在 C++ 中从另一个线程访问具有自动存储持续时间的对象总是没问题的(直到对象的生命周期结束并且当然没有数据竞争)。对吗?
【问题讨论】:
-
我不知道为什么一个线程不能将指针或对局部变量的引用传递给另一个线程;当然,假设生命周期和数据竞争问题得到了解决。它在 C++ 中非常常规地完成 - 参见例如an example here,尤其是
std::thread t3(f2, std::ref(n)); -
@IgorTandetnik,我知道。这就是为什么当我得知它是用纯 C 语言定义的实现时,我如此惊讶的原因。
-
不管怎样,该文本在我最新的 C2x 草案中。
标签: c++ multithreading language-lawyer lifetime