pthread_key_tとpthread_key_createの仕組みを理解するのに何らかの問題があります。私の理解から、各スレッドはTLS(スレッドローカルストレージ)を持ち、キーはスレッドローカルストレージにアクセスするために使用されます。キーが作成されると、すべてのスレッドで使用されますか?スレッド0はキー0を作成し、スレッド1はキー0を使用できますか?スレッド1がキー0を使用した場合、スレッド1はそれ自身のTLSまたはスレッド0のTLSにアクセスしますか?pthread_key_tとpthread_key_createメソッドはどのように機能しますか?
グローバルな配列や、使用されているすべてのキーを追跡するものがありますか?
したがって、pthread_key_createのソースコードを見ると、pthread_key_t内にkeyという変数がTlsAllocから返されるものに設定されます。キーはポインタですが、TlsAllocから返されるのは何ですか?スレッドごとに空のスロットの配列ですか?また、各スレッドに独自のTls空間がある場合、配列の各要素はスレッドTls空間を指し示すだけですか?私はちょうどどこかで混乱しています、そして、私はどこを知っていません。たぶん、私はこれが必要以上に複雑になっています。 – user972276
確かに技術的には、pthread_keyは疎配列へのポインタに過ぎず、_create関数を呼び出すと作成されます。スレッドが_setspecific()関数を呼び出すと、スレッドのIDと関数によって格納された値(この例では構造体へのポインタ)が配列のエントリに書き込まれます。スレッドが_getspecific()を呼び出すと、キーで配列を検索し、その配列のエントリをスレッドIDで検索し、格納された値を探します。 –
これらのインターフェイスのポイントは、舞台裏で起こっていることを抽象化することであり、プログラムはプラットフォーム/実装に依存しないことを覚えておいてください。 –