多线程调度中如何实现为多个线程分配均等的时间片?

时间:2021-10-02 08:32:00
我遇到的问题是main函数起了9个线程,对于单个线程来讲会是走走停停,停停走走,虽然每个线程都有平等的运行机会,但是CPU分配时间片是不受程序控制的,所以可能出现某个线程运行时间多,某个线程运行时间少的情况,极端情况下某些线程甚至可能无法得到时间片,这只是概率问题。
但目前我想实现所有线程运行的时间大致均等,请问有没有好的实现办法?谢谢各位。
至于考虑到互斥同步,虽然每个线程抢占得到互斥对象的概率相同,但涉及到概率问题总会出现某些特殊情况,小概率事件也是会发生的,所以互斥同步好像无法实现.

8 个解决方案

#1


线程我记得可以设置优先级。
另,每个线程都加一个:Sleep(1)试试。

#2


引用 1 楼 loaden 的回复:
线程我记得可以设置优先级。
另,每个线程都加一个:Sleep(1)试试。

对于优先级我请教一下,我利用_beginthreadex创建线程,使用的默认参数,那么9个线程的优先级应该相同吧?即使多个线程的优先级相同,但某些极端情况下也会出现个别线程分不到时间片的情况吧应该?

#3


引用 2 楼 tugouxp 的回复:
引用 1 楼 loaden 的回复:
线程我记得可以设置优先级。
另,每个线程都加一个:Sleep(1)试试。

对于优先级我请教一下,我利用_beginthreadex创建线程,使用的默认参数,那么9个线程的优先级应该相同吧?即使多个线程的优先级相同,但某些极端情况下也会出现个别线程分不到时间片的情况吧应该?

是的。所以,这很难控制。
我觉得:你可以考虑使用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


很不幸不行,定时器自己实际也无法保证时间均等
引用 4 楼 macrojj 的回复:
分成均等的时间 就是每个线程都运行一定的时间哇?
能不能获得核心对象的时候 开启一个计时。然后 计时器去释放这个核心对象呢?

#8


引用 6 楼 arong1234 的回复:
第一我觉得你是在做概率上接近于0的事情,其实毫无必要
其次,即使你有办法客服,所花的代价恐怕要比你收获的好处要大许多

所以只有送你一句话:何必呢?


有道理啊,感觉是系统机理上的问题,无法克服,是我的模型建立的不对。

#1


线程我记得可以设置优先级。
另,每个线程都加一个:Sleep(1)试试。

#2


引用 1 楼 loaden 的回复:
线程我记得可以设置优先级。
另,每个线程都加一个:Sleep(1)试试。

对于优先级我请教一下,我利用_beginthreadex创建线程,使用的默认参数,那么9个线程的优先级应该相同吧?即使多个线程的优先级相同,但某些极端情况下也会出现个别线程分不到时间片的情况吧应该?

#3


引用 2 楼 tugouxp 的回复:
引用 1 楼 loaden 的回复:
线程我记得可以设置优先级。
另,每个线程都加一个:Sleep(1)试试。

对于优先级我请教一下,我利用_beginthreadex创建线程,使用的默认参数,那么9个线程的优先级应该相同吧?即使多个线程的优先级相同,但某些极端情况下也会出现个别线程分不到时间片的情况吧应该?

是的。所以,这很难控制。
我觉得:你可以考虑使用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


很不幸不行,定时器自己实际也无法保证时间均等
引用 4 楼 macrojj 的回复:
分成均等的时间 就是每个线程都运行一定的时间哇?
能不能获得核心对象的时候 开启一个计时。然后 计时器去释放这个核心对象呢?

#8


引用 6 楼 arong1234 的回复:
第一我觉得你是在做概率上接近于0的事情,其实毫无必要
其次,即使你有办法客服,所花的代价恐怕要比你收获的好处要大许多

所以只有送你一句话:何必呢?


有道理啊,感觉是系统机理上的问题,无法克服,是我的模型建立的不对。