多核CPU, WIN7 64位环境下,同一个线程下的不同函数,可否同时运行?

sealdh 2014-01-10 01:25:52
【我的程序】
一个基于对话框的程序,在某一个按钮的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下,同一个线程可以同时运行在不同的核下?

...全文
271 点赞 收藏 8
写回复
8 条回复
gogo111007 2014年09月10日
你那个Line2该不会回到消息循环了吧? while(...) { getmessage(...) ... } 或者说调用了一些COM组件的方法?其实这些方法是在内部跑消息循环(那种单线程套间的COM组件就爱干这种事情) ,然后就调度了计时器消息。 你在Line1的时候输出一下日志,把调用栈贴出来看看呢? 如果在执行Line2一半的时候执行了Line1,一会应该还会再回到Line2,也就是说如果确实是同一个线程的话,Line2那个函数应该还在调用栈里面。
回复 点赞
Eleven 2014年01月10日
同一个线程应该是按顺序执行的,不应该在OnMyButtonClick函数还在执行没有返回的情况下调用OnTimer中去执行
回复 点赞
hdg3707 2014年01月10日
按楼主的观察,在多核下程序就会出错的,比如LIN1没执行完,但LIN2却根据LIN1的结果运行,那么LIN2运行结果肯定是错的
回复 点赞
worldy 2014年01月10日
引用 楼主 sealdh 的回复:
【我的程序】 一个基于对话框的程序,在某一个按钮的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下,同一个线程可以同时运行在不同的核下?
表示怀疑。即使多核的情况下,一个线程也不可能一个处理未处理完毕就启动另一个处理 窗口线程运行基于消息循环,而消息循环中的DispatchMessage调用窗口过程,窗口过程执行完毕消息才能抽取下一个窗口消息,一个窗口消息未返回,怎么可能能得到WM_TIMER消息? 感觉lz观察有误
回复 点赞
zhuyf87 2014年01月10日
先执行Line2,还是先执行OnTimer,完全看系统调度。我觉得拿这个来研究多核没有意义。
回复 点赞
bluesky_ql 2014年01月10日
不应该啊,能不能把你完整的代码贴一下
回复 点赞
sealdh 2014年01月10日
引用 1 楼 oyljerry 的回复:
OnTimer是基于消息队列的,优先级比较低,单核,可能得不到CPU调度,所以消息没有得到处理
具体怎么理解呢? 那为什么多核时就可以得到处理呢?即:在多核环境下,一会运行 Line 2, 一会运行Line 1。 那为什么单核时的结果不是这样?
回复 点赞
oyljerry 2014年01月10日
OnTimer是基于消息队列的,优先级比较低,单核,可能得不到CPU调度,所以消息没有得到处理
回复 点赞
发动态
发帖子
VC/MFC
创建于2007-09-28

7898

社区成员

42.1w+

社区内容

VC/MFC相关问题讨论
社区公告
暂无公告