私はスレッドにいます。住所があります。そのアドレスは、私が使用しているのと同じスタック上の変数からのものですか?
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などを使用できる/使用すべきであることも知っています. (CMPXCH16を避けたいと思っています)。私が何をしているのかをある程度知っていることを信じてください:-)。
これは、現時点では Windows 専用です。しかし、携帯性が高いほど良いです。(NT/XP/7/CE?)
PSこのサイトは「stackoverflow」と呼ばれているので、質問するのに適切な場所であるはずですよね? :-)
編集:誰もが尋ねているので、コンテキストを追加します。pthread_once または boost.threads call_once に似たカスタム call_once を実装しています。私は再帰をチェックしようとしています。私が取り組まなければならないことは非常に限られています。関数パラメーターを追加できません。プログラムの残りの部分が何をしているのか、たとえばどれだけの TLS が既に使用されているかを推測することはできません。などなど。私は自分の 1 つの関数内でしかコーディングできず、それ以外のことについて変更や仮定を行うことはできません。
質問/回答ありがとうございます。