我的CurrentThreadID可以改变吗?

时间:2013-10-27 16:32:57

标签: multithreading winapi

运行一段代码的线程是否可以在该代码块中更改?

我特别想到在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

1 个答案:

答案 0 :(得分:0)

简短的回答是否定的。没有同步功能可以做到这一点。

有了足够的聪明和邪恶,你可以创造一个这样做的功能。但是,你会期望它会破坏事情,这就是没有人真正做到这一点的原因。

只是最明显的问题 - 如果调用线程在同步调用期间持有锁,会发生什么?