
1个回答
展开全部
1.如果只是想放弃当前线程的CPU时间片,可以用Sleep和SwitchToThread
1)线程可以调用Sleep函数使其在指定时间内不被调度:
VOID Sleep(DWORD dwMilliseconds);
Sleep调用会挂起当前线程,dwMilliseconds毫秒之后再将其恢复为可调度的。
Sleep函数有以下几点值得注意:
a) 因为Windows并不是一个实时系统,dwMilliseconds只是一个建议值,因此Sleep调用时,系统挂起当前线程的时长大约是dwMilliseconds毫秒。比如,当dwMilliseconds设置为100时,在大多数情况下,当前线程睡眠的时长并不会是100ms,可能是几百毫秒、几秒、几分钟等等。
b) dwMilliseconds=INFINITE(-1)会使当前线程永远睡眠,这通常没什么用处。
c) dwMilliseconds=0时,当前线程会放弃剩余的时间片,系统会尝试调度优先级等于或高于当前线程 的可调度线程,如果没有找到这样的线程,系统将马上重新调度调用Sleep的线程。
2)SwitchToThread 当前线程可以调用SwitchToThread强迫操作系统调度另外的可调度线程(如果存在)。
BOOL SwitchToThread();
当前线程调用SwitchToThread时,系统会检查是否存在可调度的线程处于“饥饿”状态,如果没有找到,SwitchToThread立刻返回,系统继续执行当前线程,否则系统将暂停当前线程并调度处于“饥饿”状态的线程(无论该线程的优先级大小),“饥饿”线程的调度时间大约是一个时间片,然后系统调度将恢复正常。
当线程A需要获得某资源,而该资源又被另一优先级较低的线程B占用时,A可以调用SwitchToThread迫使操作系统调度低先级的进程,以期待B释放被占用的资源。当没有其它线程可调度时,SwitchToThread返回FALSE,否则返回一个非0值。
SwitchToThread使用可参考http://hi.baidu.com/alizx/blog/item/1bd7468e6e1975e5f01f3601.html
SwitchToThread函数和Sleep(0)调用类似,不同之处在于SwitchToThread允许系统调度优先级低于当前线程的可调度线程,但Sleep(0)只允许调度优先级不低于当前线程的可调度线程。
2.上述两个函数只是在当前调度内放弃CPU时间,如果你是要根据条件查询的结果决定是否放弃时,可以采用
while(条件){Sleep(0);}
或while(条件){SwitchToThread();}
3.如果不想通过查询的方式,可以采用异步通知的方式。比如调用WaitForSingleObject某一事件(Event)这样的阻塞函数,等待被置信。该函数首先在用户空间检查是否被置信。如果不是,则进入内核态放弃当前线程的CPU时间片,然后等待被外部置信;也可以直接SuspendThread自身,等待外部唤醒,原理和WaitForSingleObject类似。
4.如果想永久放弃时间片,可以让线程结束,直接return 0;
1)线程可以调用Sleep函数使其在指定时间内不被调度:
VOID Sleep(DWORD dwMilliseconds);
Sleep调用会挂起当前线程,dwMilliseconds毫秒之后再将其恢复为可调度的。
Sleep函数有以下几点值得注意:
a) 因为Windows并不是一个实时系统,dwMilliseconds只是一个建议值,因此Sleep调用时,系统挂起当前线程的时长大约是dwMilliseconds毫秒。比如,当dwMilliseconds设置为100时,在大多数情况下,当前线程睡眠的时长并不会是100ms,可能是几百毫秒、几秒、几分钟等等。
b) dwMilliseconds=INFINITE(-1)会使当前线程永远睡眠,这通常没什么用处。
c) dwMilliseconds=0时,当前线程会放弃剩余的时间片,系统会尝试调度优先级等于或高于当前线程 的可调度线程,如果没有找到这样的线程,系统将马上重新调度调用Sleep的线程。
2)SwitchToThread 当前线程可以调用SwitchToThread强迫操作系统调度另外的可调度线程(如果存在)。
BOOL SwitchToThread();
当前线程调用SwitchToThread时,系统会检查是否存在可调度的线程处于“饥饿”状态,如果没有找到,SwitchToThread立刻返回,系统继续执行当前线程,否则系统将暂停当前线程并调度处于“饥饿”状态的线程(无论该线程的优先级大小),“饥饿”线程的调度时间大约是一个时间片,然后系统调度将恢复正常。
当线程A需要获得某资源,而该资源又被另一优先级较低的线程B占用时,A可以调用SwitchToThread迫使操作系统调度低先级的进程,以期待B释放被占用的资源。当没有其它线程可调度时,SwitchToThread返回FALSE,否则返回一个非0值。
SwitchToThread使用可参考http://hi.baidu.com/alizx/blog/item/1bd7468e6e1975e5f01f3601.html
SwitchToThread函数和Sleep(0)调用类似,不同之处在于SwitchToThread允许系统调度优先级低于当前线程的可调度线程,但Sleep(0)只允许调度优先级不低于当前线程的可调度线程。
2.上述两个函数只是在当前调度内放弃CPU时间,如果你是要根据条件查询的结果决定是否放弃时,可以采用
while(条件){Sleep(0);}
或while(条件){SwitchToThread();}
3.如果不想通过查询的方式,可以采用异步通知的方式。比如调用WaitForSingleObject某一事件(Event)这样的阻塞函数,等待被置信。该函数首先在用户空间检查是否被置信。如果不是,则进入内核态放弃当前线程的CPU时间片,然后等待被外部置信;也可以直接SuspendThread自身,等待外部唤醒,原理和WaitForSingleObject类似。
4.如果想永久放弃时间片,可以让线程结束,直接return 0;
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询