Je suis dans un fil. J'ai une adresse. Est-ce l'adresse d'une variable sur la même pile que j'utilise?Comment dire par programme si deux variables sont sur la même pile? (sous Windows)
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()
}
}
Je dois implémenter on_same_stack(addr1, addr2)
. Je sais que la ou les pile (s) sur Windows grandissent selon les besoins, mais je sais aussi qu'il y a une limite à la croissance, et que (dans le débogage au moins) il y a du code de pile-débordement sur chaque appel de fonction. Donc je pense que cela peut être fait. Maintenant, je sais aussi que je pourrais/devrait utiliser des identifiants de threads, etc. Mais j'essaie d'implémenter un codage sans verrou difficile ici, et je n'ai pas vraiment la place pour stocker les identifiants de threads, juste un seul pointeur. (J'espère éviter CMPXCH16). S'il vous plaît croyez-moi que je sais quelque peu ce que je fais :-).
Ceci est pour Windows seulement pour l'instant. Mais plus c'est portable, mieux c'est. (NT/XP/7/CE?)
P.S. ce site est appelé "stackoverflow" donc ce devrait être le bon endroit à demander, n'est-ce pas? :-)
EDIT: ajout de contexte, puisque tout le monde le demande. J'applique un call_once similaire à pthread_once ou boost.threads call_once. J'essaie de vérifier la récursivité. Je suis très limité avec ce que je dois travailler avec. Je ne peux pas ajouter de paramètres de fonction. Je ne peux pas faire d'hypothèses sur ce que fait le reste du programme, comme la quantité de TLS qu'ils utilisent déjà. Etc. Je ne peux coder que dans ma seule fonction, et ne faire aucun changement ou supposition à propos de quoi que ce soit en dehors de cela.
Merci pour vos questions/réponses.
Quel est le problème avec l'appel GetThreadId()? –
Bien sûr, dès que je poste, je le trouve: Besoin de regarder le bloc d'information de fil, se cachant au registre fs. Quelqu'un sait à quoi cela ressemble dans Win64? – tony
Le code ci-dessus est évidemment une simplification. Dans mon cas, je n'ai pas de place pour stocker le ThreadId. J'ai déjà utilisé toute ma chambre avec un pointeur. En programmation sans verrou, vous n'avez souvent que 32 bits pour travailler avec * atomiquement *. Ou 64 sur les systèmes 64 bits. Ou en fait, généralement deux fois plus (64 sur 32 bits, 128 sur 64), mais pas toujours. Et si vous obtenez ces bits supplémentaires, ils ont tendance à être utilisés pour les compteurs pour éviter les problèmes ABA, etc Donc, si je peux éviter de stocker le threadID, je le ferai. Merci. – tony