多线程间切换周期

时间:2022-03-11 21:19:20
硬件平台: Win7 系统 I5处理器  4G内存
软件平台: VS2010   C#  桌面应用程序


   A:     最近做一项目,对实时性要求有点高。在项目应用程序中,开了6个线程,但总感觉线程间切换的实时性偏低。


   B:有把线程及进程的优先等级调高一个级别,但效果不明显。


  现求助各位:  1: 怎样提高线程的实时性,缩短“时间片”?

          2: 正常情况下线程间切换周期大概多长时间?
 
          3: 相关资料介绍?
 
 

    谢谢。

16 个解决方案

#1


没看懂。也许是不知道你的程序到底干什么。

1. 一个进程总是开“6个线程”,这是干什么呢?一个进程应该随着需要而使用线程。可能一瞬间需要使用30个线程,可能一瞬间只需要1个子线程,可能一段时间内根本不使用任何子线程(等待事件触发嘛)。怎么会是“循环、阻塞、死等”什么东西呢?如果你在那里“循环、阻塞、死等”,那么我相信就凭你的这个算法,真正有任务时也不可能有足够的并发能力去处理,可能因为阻塞而变慢。
2. 谁跟你说过线程的目的是“提高线程的实时性”?多线程处理,那么每一个任务单独看,肯定比顺序执行时要慢了许多。怎么可能“提高”呢?

线程的目的到底是为什么,你了解过吗?

#2


回答你后一个问题:“正常情况下线程间切换周期大概多长时间?”

这又无数的资料。在很多年以前,windows的桌面系统默认地“抢先式线程调度”机制,每隔几十毫秒(不超过50毫秒)就切换一次线程。现在的windows系统只可能缩短,应该不会延长。

你的问题应该是程序设计问题,不是线程切换周期长短的问题。

#3


引用 1 楼 sp1234 的回复:
没看懂。也许是不知道你的程序到底干什么。

1. 一个进程总是开“6个线程”,这是干什么呢?一个进程应该随着需要而使用线程。可能一瞬间需要使用30个线程,可能一瞬间只需要1个子线程,可能一段时间内根本不使用任何子线程(等待事件触发嘛)。怎么会是“循环、阻塞、死等”什么东西呢?如果你在那里“循环、阻塞、死等”,那么我相信就凭你的这个算法,真正有任务时也不可能有足够的并发能力去处理,可能因为阻塞而变慢。
2. 谁跟你说过线程的目的是“提高线程的实时性”?多线程处理,那么每一个任务单独看,肯定比顺序执行时要慢了许多。怎么可能“提高”呢?

线程的目的到底是为什么,你了解过吗?



不好意思,没表达清楚:
  
   A:  我是写一自动化设备控制程序+视觉处理(2个相机)

   B: 控制设备运行一个线程,抓取图像 分析图像 写入分析结果各一个线程

   C: 主要是有一个线程扫描IO口状态,当外部状态发生变化时,程度能即时捕获状态(硬件时钟扫描周期能满足),主要是想表达这个意思。

   谢谢

#4


“线程间切换的实时性”这个概念不对头。
现在都有4个CPU了,理论上多个线程是可以并发运行的。

你要先查是哪个线程响应速度不够

#5


在现在使用的Windows系统来说,你可以认为操作系统切换线程的时间 片是:15MS
但是记住,Windows本身是一个抢占式的操作系统.

#6


时间片大约30ms

windows谈个屁的实时性啊
想让你程序看起来更“实时”,可以拼CPU,多核超线程啥的,也可以提升进程和线程的优先级,尽量运行更少的程序。

#7


抓取图像 分析图像 写入分析结果各一个线程

你这几个线程间有执行顺序依赖关系,需要线程同步
所以多线程根本没意义.

#8


只能回答第三个问题:《CLR via C#》 

#9


如果你开了100个线程,需要线程1执行完了再执行线程2,线程2执行完了再执行线程3...
那你不如让一个线程自己执行所有代码,还更好些.

好比你有一个煎鸡蛋的工作,必须厨师1去买鸡蛋,买回来之后厨师2打鸡蛋,厨师3煎鸡蛋,厨师4装盘子
你觉得效率能高么.
厨师1买回来还要先通知厨师2,厨师2如果在睡觉,还要先等他睡醒了.
为什么不让厨师1自己把活都干了?

#10


如果串口来的数据很快,而处理的慢,你可以开多个线程同时处理
比如上面的煎鸡蛋的例子中
如果厨师1一次性买回了很多鸡蛋,他自己肯定是忙不过来
那么厨师2,3,4应该同时去执行步骤2,3,4,这样才能加快效率
而不是分别去执行一个步骤.

#11


那么厨师2,3,4应该同时去执行步骤2,3,4,
->
厨师2先打鸡蛋,然后煎鸡蛋,然后装盘
厨师3打另一个鸡蛋,煎鸡蛋,装盘
厨师4一样
而不是厨师2只负责打鸡蛋,厨师3和4在旁边边睡觉边等

#12


引用 3 楼 u010909114 的回复:
Quote: 引用 1 楼 sp1234 的回复:

没看懂。也许是不知道你的程序到底干什么。

1. 一个进程总是开“6个线程”,这是干什么呢?一个进程应该随着需要而使用线程。可能一瞬间需要使用30个线程,可能一瞬间只需要1个子线程,可能一段时间内根本不使用任何子线程(等待事件触发嘛)。怎么会是“循环、阻塞、死等”什么东西呢?如果你在那里“循环、阻塞、死等”,那么我相信就凭你的这个算法,真正有任务时也不可能有足够的并发能力去处理,可能因为阻塞而变慢。
2. 谁跟你说过线程的目的是“提高线程的实时性”?多线程处理,那么每一个任务单独看,肯定比顺序执行时要慢了许多。怎么可能“提高”呢?

线程的目的到底是为什么,你了解过吗?



不好意思,没表达清楚:
  
   A:  我是写一自动化设备控制程序+视觉处理(2个相机)

   B: 控制设备运行一个线程,抓取图像 分析图像 写入分析结果各一个线程

   C: 主要是有一个线程扫描IO口状态,当外部状态发生变化时,程度能即时捕获状态(硬件时钟扫描周期能满足),主要是想表达这个意思。

   谢谢


你是不是想抓图的数据读入的同时进行分析扫描,分析扫描同步写入分析

#13


是要提高性能吗

#14


这个东西得看你的程序了逻辑:
http://www.cnblogs.com/c6000/archive/2012/10/11/2720611.html
这个可以 帮你优化线程

#15


该回复于2014-08-04 16:56:07被管理员删除

#16


线程多并不代表执行速度快,效率高。
主要还是看你的设计和业务

#1


没看懂。也许是不知道你的程序到底干什么。

1. 一个进程总是开“6个线程”,这是干什么呢?一个进程应该随着需要而使用线程。可能一瞬间需要使用30个线程,可能一瞬间只需要1个子线程,可能一段时间内根本不使用任何子线程(等待事件触发嘛)。怎么会是“循环、阻塞、死等”什么东西呢?如果你在那里“循环、阻塞、死等”,那么我相信就凭你的这个算法,真正有任务时也不可能有足够的并发能力去处理,可能因为阻塞而变慢。
2. 谁跟你说过线程的目的是“提高线程的实时性”?多线程处理,那么每一个任务单独看,肯定比顺序执行时要慢了许多。怎么可能“提高”呢?

线程的目的到底是为什么,你了解过吗?

#2


回答你后一个问题:“正常情况下线程间切换周期大概多长时间?”

这又无数的资料。在很多年以前,windows的桌面系统默认地“抢先式线程调度”机制,每隔几十毫秒(不超过50毫秒)就切换一次线程。现在的windows系统只可能缩短,应该不会延长。

你的问题应该是程序设计问题,不是线程切换周期长短的问题。

#3


引用 1 楼 sp1234 的回复:
没看懂。也许是不知道你的程序到底干什么。

1. 一个进程总是开“6个线程”,这是干什么呢?一个进程应该随着需要而使用线程。可能一瞬间需要使用30个线程,可能一瞬间只需要1个子线程,可能一段时间内根本不使用任何子线程(等待事件触发嘛)。怎么会是“循环、阻塞、死等”什么东西呢?如果你在那里“循环、阻塞、死等”,那么我相信就凭你的这个算法,真正有任务时也不可能有足够的并发能力去处理,可能因为阻塞而变慢。
2. 谁跟你说过线程的目的是“提高线程的实时性”?多线程处理,那么每一个任务单独看,肯定比顺序执行时要慢了许多。怎么可能“提高”呢?

线程的目的到底是为什么,你了解过吗?



不好意思,没表达清楚:
  
   A:  我是写一自动化设备控制程序+视觉处理(2个相机)

   B: 控制设备运行一个线程,抓取图像 分析图像 写入分析结果各一个线程

   C: 主要是有一个线程扫描IO口状态,当外部状态发生变化时,程度能即时捕获状态(硬件时钟扫描周期能满足),主要是想表达这个意思。

   谢谢

#4


“线程间切换的实时性”这个概念不对头。
现在都有4个CPU了,理论上多个线程是可以并发运行的。

你要先查是哪个线程响应速度不够

#5


在现在使用的Windows系统来说,你可以认为操作系统切换线程的时间 片是:15MS
但是记住,Windows本身是一个抢占式的操作系统.

#6


时间片大约30ms

windows谈个屁的实时性啊
想让你程序看起来更“实时”,可以拼CPU,多核超线程啥的,也可以提升进程和线程的优先级,尽量运行更少的程序。

#7


抓取图像 分析图像 写入分析结果各一个线程

你这几个线程间有执行顺序依赖关系,需要线程同步
所以多线程根本没意义.

#8


只能回答第三个问题:《CLR via C#》 

#9


如果你开了100个线程,需要线程1执行完了再执行线程2,线程2执行完了再执行线程3...
那你不如让一个线程自己执行所有代码,还更好些.

好比你有一个煎鸡蛋的工作,必须厨师1去买鸡蛋,买回来之后厨师2打鸡蛋,厨师3煎鸡蛋,厨师4装盘子
你觉得效率能高么.
厨师1买回来还要先通知厨师2,厨师2如果在睡觉,还要先等他睡醒了.
为什么不让厨师1自己把活都干了?

#10


如果串口来的数据很快,而处理的慢,你可以开多个线程同时处理
比如上面的煎鸡蛋的例子中
如果厨师1一次性买回了很多鸡蛋,他自己肯定是忙不过来
那么厨师2,3,4应该同时去执行步骤2,3,4,这样才能加快效率
而不是分别去执行一个步骤.

#11


那么厨师2,3,4应该同时去执行步骤2,3,4,
->
厨师2先打鸡蛋,然后煎鸡蛋,然后装盘
厨师3打另一个鸡蛋,煎鸡蛋,装盘
厨师4一样
而不是厨师2只负责打鸡蛋,厨师3和4在旁边边睡觉边等

#12


引用 3 楼 u010909114 的回复:
Quote: 引用 1 楼 sp1234 的回复:

没看懂。也许是不知道你的程序到底干什么。

1. 一个进程总是开“6个线程”,这是干什么呢?一个进程应该随着需要而使用线程。可能一瞬间需要使用30个线程,可能一瞬间只需要1个子线程,可能一段时间内根本不使用任何子线程(等待事件触发嘛)。怎么会是“循环、阻塞、死等”什么东西呢?如果你在那里“循环、阻塞、死等”,那么我相信就凭你的这个算法,真正有任务时也不可能有足够的并发能力去处理,可能因为阻塞而变慢。
2. 谁跟你说过线程的目的是“提高线程的实时性”?多线程处理,那么每一个任务单独看,肯定比顺序执行时要慢了许多。怎么可能“提高”呢?

线程的目的到底是为什么,你了解过吗?



不好意思,没表达清楚:
  
   A:  我是写一自动化设备控制程序+视觉处理(2个相机)

   B: 控制设备运行一个线程,抓取图像 分析图像 写入分析结果各一个线程

   C: 主要是有一个线程扫描IO口状态,当外部状态发生变化时,程度能即时捕获状态(硬件时钟扫描周期能满足),主要是想表达这个意思。

   谢谢


你是不是想抓图的数据读入的同时进行分析扫描,分析扫描同步写入分析

#13


是要提高性能吗

#14


这个东西得看你的程序了逻辑:
http://www.cnblogs.com/c6000/archive/2012/10/11/2720611.html
这个可以 帮你优化线程

#15


该回复于2014-08-04 16:56:07被管理员删除

#16


线程多并不代表执行速度快,效率高。
主要还是看你的设计和业务