运行一段代码的线程是否可以在该代码块中更改?
我特别想到在ASP.net中运行的代码,其中针对线程池执行方法。
如果我的代码启动I / O操作(例如数据库),则执行将暂停,直到完成I / O完成端口。与此同时,该线程池线程可以重新用于处理另一个Web请求。
当我的I / O完成,并且我的代码返回到线程池线程时 - 它是否保证是同一个线程?
E.g。
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
。
答案 0 :(得分:0)
简短的回答是否定的。没有同步功能可以做到这一点。
有了足够的聪明和邪恶,你可以创造一个这样做的功能。但是,你会期望它会破坏事情,这就是没有人真正做到这一点的原因。
只是最明显的问题 - 如果调用线程在同步调用期间持有锁,会发生什么?