Я в теме. У меня есть адрес. Это адрес из переменной в том же стеке, который я использую?
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 растут по мере необходимости, но я также знаю, что есть предел для роста, и что (по крайней мере, в отладке) есть код проверки переполнения стека при каждом вызове функции. Поэтому я думаю, что это можно сделать.
Теперь я также знаю, что могу / должен использовать идентификаторы потоков и т. Д. Но я пытаюсь реализовать здесь несколько хитрое кодирование без блокировок, и у меня нет места для хранения идентификаторов потоков, просто один указатель. (Я надеюсь избежать CMPXCH16). Пожалуйста, поверьте мне, что я немного знаю, что я делаю: -).
Пока только для Windows. Но чем портативнее, тем лучше. (NT / XP / 7 / CE?)
P.S. этот сайт называется «stackoverflow», так что это должно быть правильное место, чтобы спросить, не так ли? : -)
РЕДАКТИРОВАТЬ: добавить контекст, так как все спрашивают.
Я реализую пользовательский call_once, похожий на pthread_once или boost.threads call_once. Я пытаюсь проверить рекурсию. Я очень ограничен тем, с чем мне приходится работать. Я не могу добавить параметры функции. Я не могу предположить, что делает остальная часть программы, например, сколько TLS они уже используют. И т. Д. Я могу кодировать только внутри своей единственной функции и не делать никаких изменений или предположений ни о чем, кроме этого.
Спасибо за ваши вопросы / ответы.