运行一段代码的线程是否可以在该代码块期间更改?
我特别考虑在 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
从我下面被扯掉?曾经。
我为什么在乎?
我关心的原因是因为我试图使对象线程安全。这意味着有时我必须知道哪个所谓的执行“线程”称为该方法。后来,当他们回来时,我知道“他们”还是“他们”。
我知道识别“编写为由一个虚拟处理单元执行的一系列机器指令”的唯一方法是通过GetCurrentThreadID
. 但是如果GetCurrentThreadID
发生变化;如果我的一系列机器指令在执行期间可以移动到不同的“虚拟处理单元”(即线程),那么我不能依赖GetCurrentThreadID
.