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从我下面被扯掉?曾经。

我为什么在乎?

我关心的原因是因为我试图使对象线程安全。这意味着有时我必须知道哪个所谓的执行“线程”称为该方法。后来,当他们回来时,我知道“他们”还是“他们”。

我知道识别“编写为由一个虚拟处理单元执行的一系列机器指令”的唯一方法是通过GetCurrentThreadID. 但是如果GetCurrentThreadID发生变化;如果我的一系列机器指令在执行期间可以移动到不同的“虚拟处理单元”(即线程),那么我不能依赖GetCurrentThreadID.

4

1 回答 1

0

最简洁的答案是不。没有同步函数可以做到这一点。

凭借足够的聪明和邪恶,您可以创建一个执行此操作的函数。但是,您会期望它会破坏事物,这就是为什么实际上没有人这样做。

作为最明显的问题——如果调用线程在同步调用期间持有锁会发生什么?

于 2013-10-27T16:36:08.043 回答