0

コードのセクションを実行しているスレッドが、そのコード ブロック中に変更される可能性はありますか?

具体的には、メソッドがスレッド プールに対して実行される 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

4

1 に答える 1

0

短い答えはノーです。これを行う同期関数はありません。

十分な賢さと悪意があれば、これを行う関数を作成できます。しかし、あなたはそれが物事を壊すことを期待するでしょう.それが、誰も実際にこれをしない理由です.

最も明白な問題として、同期呼び出しの間、呼び出しスレッドがロックを保持するとどうなるでしょうか?

于 2013-10-27T16:36:08.043 に答える