0

boost / thread / tss.hppがインスタンスであるポータブルスレッド固有のストレージ参照/IDメカニズムには、それ自体に固有のキーを生成する方法が必要ですこのキーはスレッドのスコープ内で一意であり、その後、参照するオブジェクトを取得するために使用されます。このメカニズムは、スレッドニュートラルな方法で記述されたコードで使用されます。

ブーストはこの概念の移植可能な例であるため、そのようなメカニズムはどのように具体的に機能しますか?

4

1 に答える 1

0

Boostスレッドは、pthreadスレッドライブラリ(UNIX用)およびWindowsWin32低レベルAPIに移植可能です。ライブラリを使用すると、実行の各スレッドで一意の参照を作成できます。グローバルCAPIerrnoは、この概念の例としてBoostのドキュメントに示されています。


必要に応じて無視する-目的の関数を見つけるためのソースコードのトレースにすぎません

問題の核心は、[boost]/boost/thread/tss.hppget機能thread_specific_ptrと機能から始まりますreset。つまり、参照されているオブジェクトの取得と破壊です。注:データオブジェクトは、thread_specific_ptr's ctorの参照に配置されたり、dtorによって破棄されたりすることはありません。getおよびreset関数呼び出しset_tss_dataget_tss_data。機能の設定の側面だけに焦点を当てると、重要な関数呼び出しは、関数呼び出しのチェーンをget_current_thread_data介してcppファイルを介して間接的になります。関数呼び出しがあり、[boost]/libs/thread/src/[libname]/thread.cppこれはオブジェクトの一意の識別子を作成する関数です。get_current_thread_datacreate_current_thread_tls_keythread_specific_ptr


create_current_thread_tls_keyTlsAlloc()win32(link)およびpthread_key_createpthread(link )を呼び出します。これらの呼び出しにより、ptrの初期化時に、ptrがオブジェクトのデータを取得するためにAPI固有の方法で使用できる一意の識別子を受け取ることが保証されます。特定のスレッドAPIは、スレッドID(コンテキスト固有でライブラリ自体によって解決される)とオブジェクト識別子を使用して、特定のスレッドのコンテキストに固有のオブジェクトを返します。

于 2010-04-13T10:06:44.930 に答える