gpt4 book ai didi

c++ - 如何以编程方式判断两个变量是否在同一个堆栈上? (在 Windows 中)

转载 作者:可可西里 更新时间:2023-11-01 09:57:04 25 4
gpt4 key购买 nike

我在一个线程中。我有一个地址。该地址是否来 self 正在使用的同一堆栈上的变量?

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?)

附言这个网站叫做“stackoverflow”所以它应该是正确的地方,不是吗? :-)

编辑:添加上下文,因为每个人都在问。我正在实现类似于 pthread_once 或 boost.threads call_once 的自定义 call_once。我正在尝试检查递归。我非常受限于我必须处理的事情。我无法添加函数参数。我无法假设程序的其余部分在做什么,比如他们已经使用了多少 TLS。等等。我只能在我的一个函数内编写代码,不能对函数之外的任何内容进行任何更改或假设。

感谢您的提问/回答。

最佳答案

一些疯狂的东西怎么样(未经测试):

declspec(__thread) void* stackBottom;

void Thread1Routine(void* arg)
{
volatile int bottom;
stackBottom = ⊥

... (do stuff which ends up calling on_same_stack()) ...
}


bool on_same_stack(void* p)
{
volatile int top;
return ((LONG_PTR)p >= (LONG_PTR)&top) && ((LONG_PTR)p <= (LONG_PTR)stackBottom);
}

(编辑以删除理论上的基于寄存器的 arg 传递问题)

关于c++ - 如何以编程方式判断两个变量是否在同一个堆栈上? (在 Windows 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1743511/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com