1
1
C++标准甚至不要求使用堆栈实现函数调用(或者在这个意义上线程具有堆栈)。 当前C++草稿对此表示 overlapping objects :
在(非规范性)脚注中:
在您的示例中,我认为线程没有像预期的那样正确同步,因此
如果代码被修复为正确同步,并且
然而,这并没有告诉您在没有编译器帮助的情况下是否可以在C++中实现。真实世界编译器对执行环境的假设没有反映在C++标准中,并且只被ABI标准所暗示。与堆栈交换协同路由特别相关的是,线程描述符和线程局部变量的地址在执行函数时不会更改(因为它们的计算成本很高,编译器会发出代码将它们缓存在寄存器或堆栈中)。 这就是可能发生的情况:
此时,线程B将访问
如果只在挂起协同程序的同一线程上恢复协同程序,则可以避免此问题,这是非常限制性的,而且可能不是大多数协同程序库作者所考虑的。最糟糕的是,在大多数情况下,恢复错误的线程似乎是可行的,因为一些广泛使用的线程局部变量(例如
|
2
0
对于所有的标准关注,实现调用
主要规则是不同的对象有不同的地址,其中包括“存在于堆栈上”的对象。但该规则仅适用于同时存在的两个对象,并且仅在通过适当的线程同步进行比较的情况下才适用。当然,比较地址确实会妨碍优化器,优化器可能需要为一个本来可以优化的对象分配地址。 |
pickle323 · C编程:现代方法-第10章项目6-困惑 6 年前 |
Gameatro · 为什么malloc在函数内部调用时返回空指针? 6 年前 |
E. Peracchia · F#函数调用工作不正常 6 年前 |
Jorge Zazueta · 汉诺塔C++的堆栈实现 6 年前 |
adamcasey · 缓冲区溢出“攻击”中的操作序列 6 年前 |