2012-01-25 24 views
7

pthread_key_tとpthread_key_createの仕組みを理解するのに何らかの問題があります。私の理解から、各スレッドはTLS(スレッドローカルストレージ)を持ち、キーはスレッドローカルストレージにアクセスするために使用されます。キーが作成されると、すべてのスレッドで使用されますか?スレッド0はキー0を作成し、スレッド1はキー0を使用できますか?スレッド1がキー0を使用した場合、スレッド1はそれ自身のTLSまたはスレッド0のTLSにアクセスしますか?pthread_key_tとpthread_key_createメソッドはどのように機能しますか?

グローバルな配列や、使用されているすべてのキーを追跡するものがありますか?

答えて

5

pthread_keysは、共通鍵で参照されるスレッドローカルストレージです。そのため、複数のスレッドが同じキーを使用しますが、異なるストレージスペース(スレッドごと)を取得します。

たとえば、(IMAPのような)非同期サーバーを構築していたとします。現在のタスク/要求のキーを持つ配列のクライアント接続を追跡することができます。したがって、リクエストが来ると新しいスレッドがスピンアップし、スレッドはClient_Connection-> WhatAmIDoingキーに "request"構造体へのポインタを格納します。スレッドが実行する関数は単にpthread_getspecific()関数を呼び出して、それが実行されるはずのものへのポインタを取得できるため、スレッドはそのポインタを渡す必要はありません。

+1

したがって、pthread_key_createのソースコードを見ると、pthread_key_t内にkeyという変数がTlsAllocから返されるものに設定されます。キーはポインタですが、TlsAllocから返されるのは何ですか?スレッドごとに空のスロットの配列ですか?また、各スレッドに独自のTls空間がある場合、配列の各要素はスレッドTls空間を指し示すだけですか?私はちょうどどこかで混乱しています、そして、私はどこを知っていません。たぶん、私はこれが必要以上に複雑になっています。 – user972276

+2

確かに技術的には、pthread_keyは疎配列へのポインタに過ぎず、_create関数を呼び出すと作成されます。スレッドが_setspecific()関数を呼び出すと、スレッドのIDと関数によって格納された値(この例では構造体へのポインタ)が配列のエントリに書き込まれます。スレッドが_getspecific()を呼び出すと、キーで配列を検索し、その配列のエントリをスレッドIDで検索し、格納された値を探します。 –

+1

これらのインターフェイスのポイントは、舞台裏で起こっていることを抽象化することであり、プログラムはプラットフォーム/実装に依存しないことを覚えておいてください。 –

関連する問題