【我的程序】
一个基于对话框的程序,在某一个按钮的click处理函数中有如下代码:
void MyDialog::OnMyButtonClick()
{
::SetTimer(m_hWnd, 99999, 200, NULL);
//Do some operation here, need about 1 minutes. /* Line 2 */
}
void MyDialog::OnTimer(UINT_PTR nIDEvent)
{
// DoSomeOperation(); /* Line 1 */
CDialog::OnTimer(nIDEvent);
}
【运行结果】
1. 单CPU环境下,OnTimer得不到调度,直到Line2执行结束。
2. 多核环境下(I5的CPU,从任务管理器上看,似乎是4个核),OnTimer可以得到调度,即使Line2还没有执行完毕。
【分析】
经过测试,OnMyButtonClick和OnTimer是运行在同一个线程中。
按照我以前认识,当同一个线程被阻塞时(Line 2),即使时间片再轮回到该线程中,应该再次运行阻塞点,即Line2中未执行的部分。也就是说,我觉得我的分析和单核CPU的运行结果相同。
但是为什么在多核CPU下,Line2和Line1可以同时运行(同一个线程)?如果是,那说明在多核CPU下,同一个线程可以同时运行在不同的核下?