多核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下,同一个线程可以同时运行在不同的核下?

...全文
387 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
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调度,所以消息没有得到处理

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧