-1

これらの質問に関連して:

CLRの「わかりやすい」方法で_real_スレッドIDを取得するにはどうすればよいですか?

管理対象スレッドはどのくらいの頻度でOSスレッドを切り替えますか?

Thread.BeginThreadAffinity()メソッドを実際にテストして、それらがどのように機能し、どのように機能するかを確認できるようにしたいと思います。

OSスレッドの切り替えを強制する.NET機能はありますか?

4

1 に答える 1

3

Thread.BeginThreadAffinity()でテストすることはあまりありません。CLRホストの関数IHostTaskManager::BeginThreadAffinity()を呼び出します。IHostTaskManagerは、カスタムCLRホストがカスタムスレッド実装を提供するために実装できるオプションのインターフェイスであり、必ずしもオペレーティングシステムスレッドを使用する必要はありません。ICLRTaskManagerおよびICLRTaskインターフェイスは、このようなカスタムスレッドのコアサービスを提供します。

これらのインターフェイスは、SQLServerチームからの要求に応じて.NET2.0で追加されました。SQL Serverには、ファイバーに基づいたカスタムスレッドオプションが長い間組み込まれています。ファイバーは、複数のプロセッサーコアを備えたマシンがまだまれであった昔は人気がありました。ファイバーの他の名前は「グリーンスレッド」と「コルーチン」です。彼らは過去10年間のマルチコア革命によって放牧されてきました。

SQLServerプロジェクトは破産しました。彼らはそれを十分に信頼できるものにすることができず、プロジェクトを放棄しました。残念ながら、結果は残ります。最初のリンクのサブジェクトであるOSスレッドに.NETスレッドをマップする簡単な方法はありません。受け入れられた回答に示されているかなりのFUDと同様に。

CLRはまだこの機能の基本的なサポートを持っていますが、カスタムホストが独自のスレッドを実装する単一の例を私は知りません。SQL Serverチームプロジェクトの大規模な失敗は、チームがこの作業を行うためにアクセスできるリソースを考慮すると、これを実装するのが難しいという大きな道標でした。また、一般的には意味がありません。オペレーティングシステムによってデフォルトで実行され、デフォルトのCLRホストによって使用されるように、単一のスレッドを単一のプロセッサコアにマッピングすることは、効率を上げるのに非常に困難です。最近のプロセッサコアは非常に安価に購入できます。

簡単に言うと、Thread.BeginThreadAffinity()は何もしませ。CLRスレッドは、デフォルトですでにOSスレッドにアフィンです。カスタムCLRホストに遭遇する可能性は、メソッドを無視するのに十分にゼロに近いものです。

OSスレッドコンテキストスイッチを呼び出す簡単な方法は、WaitHandle.WaitXxx()メソッドの1つ、またはゼロ以外の待機を伴うThread.Sleep()を使用することです。

于 2013-03-14T12:33:35.343 に答える