我在一个线程中。我有一个地址。该地址是否来自我正在使用的同一堆栈上的变量?
static int *address;
void A()
{
int x;
atomic::CAS(address, 0, &x); // ie address = &x
// ...
}
void B()
{
int y;
int * addr = atomic::read(address); // ie addr = address
if (addr && on_same_stack(&y, addr))
{
// B() called from A()
}
else
{
// B() called from different thread than A()
}
}
我需要实施on_same_stack(addr1, addr2)
. 我知道 Windows 上的堆栈会根据需要增长,但我也知道增长是有限制的,而且(至少在调试中)每个函数调用都有堆栈溢出检查代码。所以我认为这是可以做到的。
现在,我也知道我可以/应该使用线程 ID 等。但是我正在尝试在这里实现一些棘手的无锁编码,而且我真的没有空间来存储线程 ID,只有一个指针. (我希望避免 CMPXCH16)。请相信我,我有点知道我在做什么:-)。
这目前仅适用于 Windows。但是越便携越好。(NT/XP/7/CE?)
PS这个网站被称为“stackoverflow”所以它应该是正确的地方,不是吗?:-)
编辑:添加上下文,因为每个人都在问。我正在实现一个类似于 pthread_once 或 boost.threads call_once 的自定义 call_once。我正在尝试检查递归。我的工作非常有限。我无法添加函数参数。我无法假设程序的其余部分在做什么,比如他们已经使用了多少 TLS。等等。我只能在我的一个函数内编码,并且不能对除此之外的任何内容进行更改或假设。
感谢您的问题/回答。