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

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

//有这样两个线程:

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该线程,那么这两种方式的区别(操作系统在线程调度上的区别)。

------解决方案--------------------
我的问题是:线程threadPro2->Wait Event,然后到线程threadPro1运行,当线程1给事件设置信号后线程又是怎么运行的? 
============================================================================
线程threadPro2和线程threadPro1同时运行。

------解决方案--------------------
其实waitforsingleobject就是一个不断检测信号状态的功能块,类似为while(...){},如果检测到信号就往下执行。所以也就是如果threadPro2获得CPU时间,他就不断这样运行,剩下的就是普通的线程调度了。第二个问题我觉得其实就是新创建的线程何时放入线程池中排队等待CPU时间片的问题,应该只是一个排队前后的问题。
------解决方案--------------------
1、两个线程“同时”运行。
2、可以认为没有差别。
这两个问题的细节部分与系统环境有关,在通常情况下是不需要深究的,除非你的项目要求与此细节有关。
------解决方案--------------------
WaitForSingleObject函数中的Handle是内核对象句柄。
你的m_event初始化了吗?
m_event = CreateEvent(....)

CPU对threadPro1和threadPro2是怎么调度的问题。
要看threadPro1和threadPro2的创建时机和它们的线程优先级等级。

你上边的运行流程是这样的:
threadPro2(...) 运行到WaitForSingleObject(m_event,INFINITE)时,该线程就暂停了,一直等到threadPro1(...)中执行了SetEvent(m_event)为止。

问题二:
这两中在调度上边是没有区别的。
它们的主要区别是:
创建时挂起线程后,你可以改变线程内核对象结构体(CONTEXT),该结构体保存了线程运行时信息。
比喻你可以改变线程优先级、线程堆栈值等等(SetThreadContext(.....)。



------解决方案--------------------
不断检测信号量,发现有信号量就执行了,否则就跳过
------解决方案--------------------
单核系统由操作系统来分配时间片轮流执行,多核系统就有可能是同时执行了。
------解决方案--------------------
探讨
又想了,这个“同时”运行的意思是不是就是说这两个线程运行的时间上可能是不确定的,说不准系统调度哪一个线程,而使该线程处于运行状态。

------解决方案--------------------
线程的运行顺序是不固定的,应该是有受OS或CPU控制的,所以我同意楼上的说法
------解决方案--------------------
从微观上来说:
//问题一:

我的问题是:线程threadPro2->Wait Event,然后到线程threadPro1运行,当线程1给事件设置信号后线程又是怎么运行的? 

-->当线程threadPro2->WaitFor...执行时,系统将threadPro2放入等待队列并将线程切换到threadPro1(假设系统中没有其它满足运行条件并等待运行的线程), 当线程1设置信号量时,系统调整了线程2的优先级(它已经满足了运行条件,等CPU有空闲时就能运行),如果此时线程1的时间片用完了,那么系统将线程1放入等待队列,切换并执行线程2后续代码;如果此时线程1时间片还没有用完,那么线程1将继续执行。


问题二: 
当在一个线程内创建一个新的线程时,如果创建的新线程是创建后立即执行和创建后挂起,然后紧接着就ResumeThread该线程,那么这两种方式的区别(操作系统在线程调度上的区别)。

--> 回答同问题1, 不管创建的新线程是否设置成立即执行,系统都会将它放入等待队列(因为目前是在当前线程的执行时间片内),由于每个CPU都有一个等待执行线程的队列,所以如果是多核系统,创建的是个立即执行的线程,并且某个cpu正好有空,那么新建线程将运行于那个空闲cpu上,和当前线程物理上同时执行。如果是单核系统,那么情况就有趣得多,即使当前线程创建了一个挂起的线程,如果在它cpu时间片用完前执行了ResumeThread,那么效果和直接创建一个立即运行的线程是完全一样的。
------解决方案--------------------
看看《操作系统原理》就明白了。
------解决方案--------------------
两个线程应该是同时运行的。
------解决方案--------------------
探讨
1、两个线程“同时”运行。
2、可以认为没有差别。
这两个问题的细节部分与系统环境有关,在通常情况下是不需要深究的,除非你的项目要求与此细节有关。

------解决方案--------------------
都说的那么清楚了,我还能说什么呢。^_^
------解决方案--------------------