Multithreading 线程101:什么是调度程序?
从前,我把这件事记在心里。随着时间的推移,我的理解已经淡化,我想刷新它 我记得,任何所谓的单线程应用程序都有两个线程: a) 具有指向main或DllMain入口点的指针的主线程;及 b) 对于具有某些UI的应用程序,UI线程,也称为WndProc运行的辅助线程,即执行WndProc的线程,该线程接收Windows向其发布的消息。简而言之,执行Windows消息循环的线程 对于UI应用程序,主线程处于阻止状态,等待来自Windows的消息。当它接收到它们时,它将它们排成队列,并将它们发送到消息循环(WndProc),UI线程启动 根据我的理解,处于阻塞状态的主线程是: C++ C#或VB.NET WinForms应用程序: 这就是他们所说的调度员吗 我的问题是: a) 我的上述理解正确吗 b) 调度员到底是怎么回事 c) 请给我指出一个资源,在那里我可以从Windows/Win32的角度更好地理解线程,然后将其与高级语言(如c#)联系起来。佩佐尔德在他的史诗作品中对这一主题的讨论十分谨慎Multithreading 线程101:什么是调度程序?,multithreading,dispatcher,message-loop,Multithreading,Dispatcher,Message Loop,从前,我把这件事记在心里。随着时间的推移,我的理解已经淡化,我想刷新它 我记得,任何所谓的单线程应用程序都有两个线程: a) 具有指向main或DllMain入口点的指针的主线程;及 b) 对于具有某些UI的应用程序,UI线程,也称为WndProc运行的辅助线程,即执行WndProc的线程,该线程接收Windows向其发布的消息。简而言之,执行Windows消息循环的线程 对于UI应用程序,主线程处于阻止状态,等待来自Windows的消息。当它接收到它们时,它将它们排成队列,并将它们发送到消息循
虽然我相信我有点正确,但肯定会有所缓解。 < P>这取决于你考虑的主要线程。大多数UI框架都有一个事件处理程序线程,该线程大部分处于空闲状态,等待低级事件。当一个事件发生时,这个线程在事件队列上获得一个锁,并将事件添加到那里。不过,这并不是我认为的首要线程。 通常,调度器接收一些事件,并根据它们的内容或类型将它们发送(如果您愿意,则发送)到另一个代码块(通常在另一个线程中,但并不总是)。从这个意义上讲,事件处理程序线程本身就是一个简单的调度程序。在队列的另一端,框架通常提供另一个调度器,该调度器将从队列中提取事件。例如,向鼠标侦听器发送鼠标事件,向键盘侦听器发送键盘事件等 编辑: 简单的调度程序可能如下所示:
class Event{
public:
EventType type; //Probably an enum
String data; //Event data
};
class Dispatcher{
public:
...
dispatch(Event event)
{
switch(event.type)
{
case FooEvent:
foo(event.data);
break;
...
}
};
我遇到的大多数人都用“dispatcher”来描述一些不仅仅是简单的传递的东西。在本例中,它基于类型变量执行不同的操作,这与我所看到的大多数Dispatcher一致。通常,开关会被多态性所取代,但开关会使示例中发生的事情更加清晰。谢谢,帕特罗斯。你的解释符合我的理解。那么,根据您的解释,如果我要将其与上面的代码相协调,那么调度程序的范围比上面的示例更广。上面的示例(C++和C#snippets)是dispatcher的示例。谢谢然而,你解释中的一些文字令人困惑。听起来,您对dispatcher的定义只描述了事件发布者和事件使用者之间的中介。你能用一些代码举例说明调度员吗?
Application.Run( new System.Windows.Forms() );
class Event{
public:
EventType type; //Probably an enum
String data; //Event data
};
class Dispatcher{
public:
...
dispatch(Event event)
{
switch(event.type)
{
case FooEvent:
foo(event.data);
break;
...
}
};