多线程同步的两个问题,可能需要高手,请关注!

山的那边还是山~ 2008-10-07 09:49:18
加精
//问题一:

//有这样两个线程:

HANDLE m_event = NULL:

void threadPro1(...)
{
...
SetEvent(m_event);
...
}

void threadPro2(...)
{
...
WaitForSingleObject(m_event,INFINITE);
ResetEvent((m_event);
...
}
//如果开始时是threadPro2线程处于运行状态,那么CPU对threadPro1和threadPro2是怎么调度的?
我的问题是:线程threadPro2->Wait Event,然后到线程threadPro1运行,当线程1给事件设置信号后线程又是怎么运行的?

问题二:
当在一个线程内创建一个新的线程时,如果创建的新线程是创建后立即执行和创建后挂起,然后紧接着就ResumeThread该线程,那么这两种方式的区别(操作系统在线程调度上的区别)。
...全文
4663 67 打赏 收藏 转发到动态 举报
写回复
用AI写文章
67 条回复
切换为时间正序
请发表友善的回复…
发表回复
nidayededayededaye 2012-02-15
  • 打赏
  • 举报
回复
这个问题也需要高手吗?

如楼上所说真的只是基本的不能再基本的东西了

估计楼主刚刚接触不到一星期吧
yanyuchonglou 2012-01-31
  • 打赏
  • 举报
回复
这个问题,包括在多核的机子上,都不需要高手,只是一些基本概念。

VC是需要一定时间的积累的,不象别的可以速成。
Kaile 2011-11-08
  • 打赏
  • 举报
回复
多核心的电脑上是同时执行的
羽毛小子 2011-10-28
  • 打赏
  • 举报
回复
xuexi
liuhui457 2011-04-06
  • 打赏
  • 举报
回复
好帖子啊………………
qianjun0411 2011-01-28
  • 打赏
  • 举报
回复
//有这样两个线程:

HANDLE m_event = NULL:

void threadPro1(...)
{
...
SetEvent(m_event);
...
}

void threadPro2(...)
{
...
WaitForSingleObject(m_event,INFINITE);
ResetEvent((m_event);
...
}
//如果开始时是threadPro2线程处于运行状态,那么CPU对threadPro1和threadPro2是怎么调度的?
我的问题是:线程threadPro2->Wait Event,然后到线程threadPro1运行,当线程1给事件设置信号后线程又是怎么运行的?


因为线程threadPro2先执行,当执行到WaitForSingleObject(m_event,INFINITE);命令时,如果m_event出入无信号状态,参数INFINITE决定了这个线程必须一直等待,直到m_event处于有信号状态。os会将这个线程挂起,放入到等待队列中。假如经过了若干个时间片后,threadPro1得到了运行机会,通过SetEvent(m_event);告知os,m_event这个内核对象被激活了,os此时就会将等待m_event而阻塞的线程放入就绪队列中,os会根据调度算法将cpu分配给某个就绪队列中的线程。调度算法请自行查阅资料。



问题二:
[color=#0000FF] 当在一个线程内创建一个新的线程时,如果创建的新线程是创建后立即执行和创建后挂起,然后紧接着就ResumeThread该线程,那么这两种方式的区别(操作系统在线程调度上的区别)。
呵呵,这个问题其实和上面那个问题是一样的,新线程创建后立即执行并不是说这个线程立即得到cpu,而是说这个线程被放入就绪队列中,一旦这个线程获得了cpu就能立即执行。而创建后挂起,紧接着执行就要看父线程是否有机会执行ResumeThread,如果有机会的话,应该没有什么区别。[/color]
usr33322 2009-12-09
  • 打赏
  • 举报
回复
软件架构QQ群 群号76395176

软件架构,UML,开发语言不限,架构是主题,软件一般问题也鼓励讨论,情感交流


工作经验5年以上,年令30以上
SenerityChzr 2008-11-20
  • 打赏
  • 举报
回复
mark
xiaoxiaoren12 2008-10-20
  • 打赏
  • 举报
回复
很好
vava62 2008-10-19
  • 打赏
  • 举报
回复
看大家的帖子又学到不少东西,基本多线程就是这种情况,setevent后,线程二才有机会继续往下面执行。
gellf 2008-10-18
  • 打赏
  • 举报
回复
MARK
maorenjian 2008-10-18
  • 打赏
  • 举报
回复
哈哈、、正在做多线程的项目。看了很受启发!!!!顶!!!!!!!!!!!!!!!
tianyagujian1 2008-10-17
  • 打赏
  • 举报
回复
楼主应该把pv操作弄清楚,这个题是关于pv的
ZhangQiuLiang 2008-10-15
  • 打赏
  • 举报
回复
牛人一群
zhengyi007 2008-10-15
  • 打赏
  • 举报
回复
学习了
豆豆大 2008-10-14
  • 打赏
  • 举报
回复
LSD,是不是要考虑优先级了呢?

学习中~~~
过期的单程票 2008-10-14
  • 打赏
  • 举报
回复
收藏了,有时间学习研究一下。
delta0001 2008-10-14
  • 打赏
  • 举报
回复
好好学习,不错!
tanfenghua518 2008-10-14
  • 打赏
  • 举报
回复
对Windows内核对象的等待,不会是采用轮询的方式,此时该线程不会被调度。当一个内核对象被设置后,设置线程会触发CPU软中断,如果是在多核平台上,Windows任务调度模块可能会立即捕获到CPU软中断,会首先判断哪个事件被触发了,将等待该事件的所有线程设置成可调度状态,但接下来不一定就会立即调度该线程,可能会临时提升优先级。任务调度模块的优先级是很高的,在多线程切合之前会不停地调用,获中断信息,进行任务调度等操作。
mrdone 2008-10-13
  • 打赏
  • 举报
回复
嗯,顶下吧,
加载更多回复(47)

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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