boost / thread / tss.hppがインスタンスであるポータブルスレッド固有のストレージ参照/IDメカニズムには、それ自体に固有のキーを生成する方法が必要です。このキーはスレッドのスコープ内で一意であり、その後、参照するオブジェクトを取得するために使用されます。このメカニズムは、スレッドニュートラルな方法で記述されたコードで使用されます。
ブーストはこの概念の移植可能な例であるため、そのようなメカニズムはどのように具体的に機能しますか?
boost / thread / tss.hppがインスタンスであるポータブルスレッド固有のストレージ参照/IDメカニズムには、それ自体に固有のキーを生成する方法が必要です。このキーはスレッドのスコープ内で一意であり、その後、参照するオブジェクトを取得するために使用されます。このメカニズムは、スレッドニュートラルな方法で記述されたコードで使用されます。
ブーストはこの概念の移植可能な例であるため、そのようなメカニズムはどのように具体的に機能しますか?
Boostスレッドは、pthreadスレッドライブラリ(UNIX用)およびWindowsWin32低レベルAPIに移植可能です。ライブラリを使用すると、実行の各スレッドで一意の参照を作成できます。グローバルCAPIerrno
は、この概念の例としてBoostのドキュメントに示されています。
必要に応じて無視する-目的の関数を見つけるためのソースコードのトレースにすぎません
問題の核心は、[boost]/boost/thread/tss.hpp
のget
機能thread_specific_ptr
と機能から始まりますreset
。つまり、参照されているオブジェクトの取得と破壊です。注:データオブジェクトは、thread_specific_ptr
's ctorの参照に配置されたり、dtorによって破棄されたりすることはありません。getおよびreset関数呼び出しset_tss_data
とget_tss_data
。機能の設定の側面だけに焦点を当てると、重要な関数呼び出しは、関数呼び出しのチェーンをget_current_thread_data
介してcppファイルを介して間接的になります。関数呼び出しがあり、[boost]/libs/thread/src/[libname]/thread.cpp
これはオブジェクトの一意の識別子を作成する関数です。get_current_thread_data
create_current_thread_tls_key
thread_specific_ptr
create_current_thread_tls_key
TlsAlloc()
win32(link)およびpthread_key_create
pthread(link )を呼び出します。これらの呼び出しにより、ptrの初期化時に、ptrがオブジェクトのデータを取得するためにAPI固有の方法で使用できる一意の識別子を受け取ることが保証されます。特定のスレッドAPIは、スレッドID(コンテキスト固有でライブラリ自体によって解決される)とオブジェクト識別子を使用して、特定のスレッドのコンテキストに固有のオブジェクトを返します。