2

私は自分のプログラムの1つからもう少しパフォーマンスを絞り出そうとしていて、優先度とアフィニティの設定を読んでいたところThread.BeginThreadAffinity、そのドキュメントには次のように書かれています。

マネージコードが現在の物理オペレーティングシステムスレッドのIDに依存する命令を実行しようとしていることをホストに通知します。

プログラムでこれをテストしたところ、パフォーマンスが約3〜4%向上しました。私の理解では、コードを別の物理オペレーティングシステムスレッドに移動すると、アフィニティ設定は失わThread.BeginAffinityれますが、同じスレッドにとどまり、アフィニティ設定を維持します。私のコードは昇格されているため、パフォーマンスが向上します。

これはどのように機能するのですか、それとも私は誤解していThread.BeginAffinityますか?

4

1 に答える 1

0

msdnによるとあなたは正しいです

Microsoft SQL Server 2005などの共通言語ランタイムの一部のホストは、独自のスレッド管理を提供します。独自のスレッド管理を提供するホストは、実行中のタスクを1つの物理オペレーティングシステムスレッドから別のスレッドにいつでも移動できます。ほとんどのタスクは、この切り替えの影響を受けません。ただし、一部のタスクにはスレッドアフィニティがあります。つまり、物理オペレーティングシステムスレッドのIDに依存します。これらのタスクは、切り替えてはならないコードを実行するときにホストに通知する必要があります。

たとえば、アプリケーションがシステムAPIを呼び出して、Win32 CRITICAL_SECTIONなどのスレッドアフィニティを持つオペレーティングシステムロックを取得する場合、ロックを取得する前にBeginThreadAffinityを呼び出し、ロックを解放した後にEndThreadAffinityを呼び出す必要があります。

SQL Server 2005で実行されるコードでこのメソッドを使用するには、コードを最高のホスト保護レベルで実行する必要があります。

于 2012-08-06T18:02:35.567 に答える