但目前我想实现所有线程运行的时间大致均等,请问有没有好的实现办法?谢谢各位。
至于考虑到互斥同步,虽然每个线程抢占得到互斥对象的概率相同,但涉及到概率问题总会出现某些特殊情况,小概率事件也是会发生的,所以互斥同步好像无法实现.
8 个解决方案
#1
线程我记得可以设置优先级。
另,每个线程都加一个:Sleep(1)试试。
另,每个线程都加一个:Sleep(1)试试。
#2
对于优先级我请教一下,我利用_beginthreadex创建线程,使用的默认参数,那么9个线程的优先级应该相同吧?即使多个线程的优先级相同,但某些极端情况下也会出现个别线程分不到时间片的情况吧应该?
#3
是的。所以,这很难控制。
我觉得:你可以考虑使用SetEvent来同步。
这是关于优先级的资料:
进程的优先级类有
优先级类 标识符 描述
实时 REALTIME_PRIORITY_CLASS 立即对事件作出响应,执行关键时间的任务。会抢先于操作系统组件之前运行。
高 HIGH_PRIORITY_CLASS 立即对事件作出响应,执行关键时间的任务。
高于正常 ABOVE_NORMAL_PRIORITY_CLASS 在正常优先级与高优先级之间运行(Windows2000)。
正常 NORMAL_PRIORITY_CLASS 没有特殊调度需求
低于正常 BELOW_NORMAL_PRIORITY_CLASS 在正常优先级与空闲优先级之间运行(Windows2000)。
空闲 IDLE_PRIORITY_CLASS 在系统空闲时运行。
设置方法:
BOOL SetPriorityClass( HANDLE hProcess, DWORD dwPriority );
DWORD GetPriorityClass( HANDLE hProcess );
使用命令外壳启动一个程序时,该程序的起始优先级是正常优先级。如果使用Start命令来启动该程序,可以使用一个开关来设定应用程序的起始优先级。例如:
c:\>START /LOW CALC.EXE
Start命令还能识别/BELOWNORMAL、/NORMAL、/ABOVENORMAL、/HIGH和/REALTIME等开关。
线程的相对优先级有
相对优先级 标识符 描述
关键时间 THREAD_PRIORITY_TIME_CRITICAL 对于实时优先级类线程在优先级31上运行,对于其他优先级类,线程在优先级15上运行。
最高 THREAD_PRIORITY_HIGHEST 线程在高于正常优先级上两级上运行。
高于正常 THREAD_PRIORITY_ABOVE_NORMAL 线程在正常优先级上一级上运行。
正常 THREAD_PRIORITY_NORMAL 线程在进程的优先级类上正常运行。
低于正常 THREAD_PRIORITY_BELOW_NORMAL 线程在低于正常优先级下一级上运行。
最低 THREAD_PRIORITY_LOWEST 线程在低于正常优先级下两级上运行。
空闲 THREAD_PRIORITY_IDLE 对于实时优先级类线程在优先级16上运行对于其他优先级类线程在优先级1上运行。
设置方法:
BOOL SetThreadPriority( HANDLE hThread, DWORD dwPriority );
DWORD GetThreadPriorityClass( HANDLE hThread );
#4
分成均等的时间 就是每个线程都运行一定的时间哇?
能不能获得核心对象的时候 开启一个计时。然后 计时器去释放这个核心对象呢?
能不能获得核心对象的时候 开启一个计时。然后 计时器去释放这个核心对象呢?
#5
在Linux平台下,不会出现这种饥渴现象,进程和线程调度是电梯算法,
只要你想,电梯一定会停,不可能某个楼层总是坐不到电梯,上下一次中,所有楼层都有机会停留
只要你想,电梯一定会停,不可能某个楼层总是坐不到电梯,上下一次中,所有楼层都有机会停留
#6
第一我觉得你是在做概率上接近于0的事情,其实毫无必要
其次,即使你有办法客服,所花的代价恐怕要比你收获的好处要大许多
所以只有送你一句话:何必呢?
其次,即使你有办法客服,所花的代价恐怕要比你收获的好处要大许多
所以只有送你一句话:何必呢?
#7
很不幸不行,定时器自己实际也无法保证时间均等
#8
有道理啊,感觉是系统机理上的问题,无法克服,是我的模型建立的不对。
#1
线程我记得可以设置优先级。
另,每个线程都加一个:Sleep(1)试试。
另,每个线程都加一个:Sleep(1)试试。
#2
对于优先级我请教一下,我利用_beginthreadex创建线程,使用的默认参数,那么9个线程的优先级应该相同吧?即使多个线程的优先级相同,但某些极端情况下也会出现个别线程分不到时间片的情况吧应该?
#3
是的。所以,这很难控制。
我觉得:你可以考虑使用SetEvent来同步。
这是关于优先级的资料:
进程的优先级类有
优先级类 标识符 描述
实时 REALTIME_PRIORITY_CLASS 立即对事件作出响应,执行关键时间的任务。会抢先于操作系统组件之前运行。
高 HIGH_PRIORITY_CLASS 立即对事件作出响应,执行关键时间的任务。
高于正常 ABOVE_NORMAL_PRIORITY_CLASS 在正常优先级与高优先级之间运行(Windows2000)。
正常 NORMAL_PRIORITY_CLASS 没有特殊调度需求
低于正常 BELOW_NORMAL_PRIORITY_CLASS 在正常优先级与空闲优先级之间运行(Windows2000)。
空闲 IDLE_PRIORITY_CLASS 在系统空闲时运行。
设置方法:
BOOL SetPriorityClass( HANDLE hProcess, DWORD dwPriority );
DWORD GetPriorityClass( HANDLE hProcess );
使用命令外壳启动一个程序时,该程序的起始优先级是正常优先级。如果使用Start命令来启动该程序,可以使用一个开关来设定应用程序的起始优先级。例如:
c:\>START /LOW CALC.EXE
Start命令还能识别/BELOWNORMAL、/NORMAL、/ABOVENORMAL、/HIGH和/REALTIME等开关。
线程的相对优先级有
相对优先级 标识符 描述
关键时间 THREAD_PRIORITY_TIME_CRITICAL 对于实时优先级类线程在优先级31上运行,对于其他优先级类,线程在优先级15上运行。
最高 THREAD_PRIORITY_HIGHEST 线程在高于正常优先级上两级上运行。
高于正常 THREAD_PRIORITY_ABOVE_NORMAL 线程在正常优先级上一级上运行。
正常 THREAD_PRIORITY_NORMAL 线程在进程的优先级类上正常运行。
低于正常 THREAD_PRIORITY_BELOW_NORMAL 线程在低于正常优先级下一级上运行。
最低 THREAD_PRIORITY_LOWEST 线程在低于正常优先级下两级上运行。
空闲 THREAD_PRIORITY_IDLE 对于实时优先级类线程在优先级16上运行对于其他优先级类线程在优先级1上运行。
设置方法:
BOOL SetThreadPriority( HANDLE hThread, DWORD dwPriority );
DWORD GetThreadPriorityClass( HANDLE hThread );
#4
分成均等的时间 就是每个线程都运行一定的时间哇?
能不能获得核心对象的时候 开启一个计时。然后 计时器去释放这个核心对象呢?
能不能获得核心对象的时候 开启一个计时。然后 计时器去释放这个核心对象呢?
#5
在Linux平台下,不会出现这种饥渴现象,进程和线程调度是电梯算法,
只要你想,电梯一定会停,不可能某个楼层总是坐不到电梯,上下一次中,所有楼层都有机会停留
只要你想,电梯一定会停,不可能某个楼层总是坐不到电梯,上下一次中,所有楼层都有机会停留
#6
第一我觉得你是在做概率上接近于0的事情,其实毫无必要
其次,即使你有办法客服,所花的代价恐怕要比你收获的好处要大许多
所以只有送你一句话:何必呢?
其次,即使你有办法客服,所花的代价恐怕要比你收获的好处要大许多
所以只有送你一句话:何必呢?
#7
很不幸不行,定时器自己实际也无法保证时间均等
#8
有道理啊,感觉是系统机理上的问题,无法克服,是我的模型建立的不对。