多线程同步的两个问题,可能需要高手,请关注!
//问题一:
//有这样两个线程:
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(.....)。
[解决办法]
不断检测信号量,发现有信号量就执行了,否则就跳过
[解决办法]
单核系统由操作系统来分配时间片轮流执行,多核系统就有可能是同时执行了。
[解决办法]