コードのセクションを実行しているスレッドが、そのコード ブロック中に変更される可能性はありますか?
具体的には、メソッドがスレッド プールに対して実行される ASP.net 内で実行されるコードを考えています。
コードが I/O 操作 (データベースなど) を開始すると、I/O 完了ポートの完了を待って実行が中断されます。その間、そのスレッドプール スレッドを再利用して、別の Web 要求を処理できます。
I/O が完了し、コードがスレッド プール スレッドに返されると、同じスレッドであることが保証されますか?
例えば
private void DoStuff()
{
DWORD threadID = GetCurrentThreadID();
//And what if this 3rd party code (e.g. ADO/ADO.net) uses completion ports?
//my thread-pool thread is given to someone else(?)
ExecuteSynchronousOperationThatWaitsOnIOCompletionPort();
//Synchronous operation has completed
threadID2 = GetCurrentThread();
}
可能ですか
threadID2 <> threadID
?
.NET スレッド プールについて言及しましたが、ネイティブ スレッド プールもあります。そして、私は両方のコードを書きました。
私が私の下から引き裂かれる可能性はありますか?ThreadID
これまで。
なぜ私は気にするのですか?
私が気にする理由は、オブジェクトをスレッドセーフにしようとしているからです。つまり、どのいわゆる実行の「スレッド」がメソッドを呼び出したかを知る必要がある場合があります。後で彼らが戻ってきたとき、私は「彼ら」がまだ「彼ら」であることを知っています。
「1つの仮想処理ユニットによって実行されるように記述された一連のマシン命令」を識別するために私が知っている唯一の方法は、GetCurrentThreadID
. しかし、GetCurrentThreadID
変更された場合。実行中に一連のマシン命令を別の「仮想処理ユニット」 (つまり、スレッド) に移動できる場合、信頼することはできませんGetCurrentThreadID
。