6

ライブラリに win-threads と pthreads 用の移植可能な TLS (スレッド ローカル ストレージ) コードがありますが、TlsXXX API は WinRT では利用できません。ただし、TLS apiとほぼ同じ目的を果たす FlsXXX api があります。MSDN から:

ファイバーは、ファイバー ローカル ストレージ (FLS) を使用して、ファイバーごとに変数の一意のコピーを作成できます。ファイバーの切り替えが発生しない場合、FLS はスレッド ローカル ストレージとまったく同じように機能します。

つまり、FlsXXX api をドロップインの代わりに使用できるということですか (私はファイバーを使用せず、変数に __thread 指定子を使用せず、API を直接使用します)。

4

1 に答える 1

7

まず、スレッドをファイバーに変換する必要があります。

これは Store アプリではできないことです。ニワトリが先か卵が先かという問題です。これは SDK のドキュメントに書かれていることですが、実際には Microsoft CRT が行うことではありません。FlsAlloc() を使用しますが、ConvertThreadToFiber/Ex() をどこでも呼び出すことはありません。CreateFiber() を呼び出さないでください。

はい、 SDK に従ってファイバーを作成しない場合、FLS は TLS と同じです。

ファイバーは、ファイバー ローカル ストレージ (FLS) を使用して、ファイバーごとに変数の一意のコピーを作成できます。ファイバーの切り替えが発生しない場合、FLS はスレッド ローカル ストレージとまったく同じように機能します。FLS 関数 (FlsAlloc、FlsFree、FlsGetValue、および FlsSetValue) は、現在のスレッドに関連付けられている FLS を操作します。スレッドがファイバーを実行しており、ファイバーが切り替えられると、FLS も切り替えられます。

CRT で使用されていることもわかります。VS2012+ vc/crt/src/Platform.cpp ソース コード ファイル、__TlsAlloc() 関数を見てください。_CRT_APP が #defined の場合、FlsAlloc にフォールバックします。これは、Store アプリで使用される VCLibs ビルド用です。

明示的に文書化されていませんが、これが問題ないという非常に強力な証拠です。

于 2013-10-27T00:16:56.297 に答える