【发布时间】:2009-11-19 18:28:35
【问题描述】:
我有一个 C# 应用程序需要在不中断数据流的情况下将数据输入流热交换到新的处理程序类。
为此,由于 CPU 切换,我必须在单个线程中执行多个步骤,而没有任何其他线程(大部分是数据接收线程)在它们之间运行。
这是情况的简化版本,但它应该能说明问题。
void SwapInputHandler(Foo oldHandler, Foo newHandler)
{
UnhookProtocol(oldHandler);
HookProtocol(newHandler);
}
这两行(unhook 和 hook)必须在同一个 cpu 片中执行,以防止任何数据包通过,以防另一个线程在它们之间执行。
如何确保这两个命令使用 C# 线程方法按顺序运行?
编辑
似乎有些混乱,所以我会尝试更具体。我的意思不是同时执行,只是在同一个 cpu 时间片中,这样在这两个完成之前没有线程执行。锁不是我要找的,因为这只会阻止在两个命令运行之前再次执行此代码。在这些命令完成之前,我需要阻止 ANY THREAD 运行。另外,我再次说这是我的问题的简化版本,所以不要试图解决我的例子,请回答问题。
【问题讨论】:
-
您不应该关心托管代码中的处理器调度。可能有更好的方法来做你想做的事。你能提供更多关于你想要达到的目标的细节吗?
-
您不希望它们同时运行 - 您希望它们按顺序运行而不会中断。并发意味着它们都在完全相同的时间运行。
-
好的-你的问题起初是误导性的。为什么不锁定不希望超过 1 个线程访问的资源?
-
根据您的问题,我认为您对锁定的工作原理有误解。您可以锁定以防止一段代码被输入两次 - 就像您在问题中提到的那样。但您也可以锁定以防止访问一个或一组变量。
-
@RichardOD 如果我锁定资源,我会通过程序输入数据流。我需要通过新的处理程序重新路由它,而程序的其余部分不知道发生了变化。
标签: c# concurrency multithreading