软件平台: VS2010 C# 桌面应用程序
A: 最近做一项目,对实时性要求有点高。在项目应用程序中,开了6个线程,但总感觉线程间切换的实时性偏低。
B:有把线程及进程的优先等级调高一个级别,但效果不明显。
现求助各位: 1: 怎样提高线程的实时性,缩短“时间片”?
2: 正常情况下线程间切换周期大概多长时间?
3: 相关资料介绍?
谢谢。
16 个解决方案
#1
没看懂。也许是不知道你的程序到底干什么。
1. 一个进程总是开“6个线程”,这是干什么呢?一个进程应该随着需要而使用线程。可能一瞬间需要使用30个线程,可能一瞬间只需要1个子线程,可能一段时间内根本不使用任何子线程(等待事件触发嘛)。怎么会是“循环、阻塞、死等”什么东西呢?如果你在那里“循环、阻塞、死等”,那么我相信就凭你的这个算法,真正有任务时也不可能有足够的并发能力去处理,可能因为阻塞而变慢。
2. 谁跟你说过线程的目的是“提高线程的实时性”?多线程处理,那么每一个任务单独看,肯定比顺序执行时要慢了许多。怎么可能“提高”呢?
线程的目的到底是为什么,你了解过吗?
1. 一个进程总是开“6个线程”,这是干什么呢?一个进程应该随着需要而使用线程。可能一瞬间需要使用30个线程,可能一瞬间只需要1个子线程,可能一段时间内根本不使用任何子线程(等待事件触发嘛)。怎么会是“循环、阻塞、死等”什么东西呢?如果你在那里“循环、阻塞、死等”,那么我相信就凭你的这个算法,真正有任务时也不可能有足够的并发能力去处理,可能因为阻塞而变慢。
2. 谁跟你说过线程的目的是“提高线程的实时性”?多线程处理,那么每一个任务单独看,肯定比顺序执行时要慢了许多。怎么可能“提高”呢?
线程的目的到底是为什么,你了解过吗?
#2
回答你后一个问题:“正常情况下线程间切换周期大概多长时间?”
这又无数的资料。在很多年以前,windows的桌面系统默认地“抢先式线程调度”机制,每隔几十毫秒(不超过50毫秒)就切换一次线程。现在的windows系统只可能缩短,应该不会延长。
你的问题应该是程序设计问题,不是线程切换周期长短的问题。
这又无数的资料。在很多年以前,windows的桌面系统默认地“抢先式线程调度”机制,每隔几十毫秒(不超过50毫秒)就切换一次线程。现在的windows系统只可能缩短,应该不会延长。
你的问题应该是程序设计问题,不是线程切换周期长短的问题。
#3
不好意思,没表达清楚:
A: 我是写一自动化设备控制程序+视觉处理(2个相机)
B: 控制设备运行一个线程,抓取图像 分析图像 写入分析结果各一个线程
C: 主要是有一个线程扫描IO口状态,当外部状态发生变化时,程度能即时捕获状态(硬件时钟扫描周期能满足),主要是想表达这个意思。
谢谢
#4
“线程间切换的实时性”这个概念不对头。
现在都有4个CPU了,理论上多个线程是可以并发运行的。
你要先查是哪个线程响应速度不够
现在都有4个CPU了,理论上多个线程是可以并发运行的。
你要先查是哪个线程响应速度不够
#5
在现在使用的Windows系统来说,你可以认为操作系统切换线程的时间 片是:15MS
但是记住,Windows本身是一个抢占式的操作系统.
但是记住,Windows本身是一个抢占式的操作系统.
#6
时间片大约30ms
windows谈个屁的实时性啊
想让你程序看起来更“实时”,可以拼CPU,多核超线程啥的,也可以提升进程和线程的优先级,尽量运行更少的程序。
windows谈个屁的实时性啊
想让你程序看起来更“实时”,可以拼CPU,多核超线程啥的,也可以提升进程和线程的优先级,尽量运行更少的程序。
#7
抓取图像 分析图像 写入分析结果各一个线程
你这几个线程间有执行顺序依赖关系,需要线程同步
所以多线程根本没意义.
你这几个线程间有执行顺序依赖关系,需要线程同步
所以多线程根本没意义.
#8
只能回答第三个问题:《CLR via C#》
#9
如果你开了100个线程,需要线程1执行完了再执行线程2,线程2执行完了再执行线程3...
那你不如让一个线程自己执行所有代码,还更好些.
好比你有一个煎鸡蛋的工作,必须厨师1去买鸡蛋,买回来之后厨师2打鸡蛋,厨师3煎鸡蛋,厨师4装盘子
你觉得效率能高么.
厨师1买回来还要先通知厨师2,厨师2如果在睡觉,还要先等他睡醒了.
为什么不让厨师1自己把活都干了?
那你不如让一个线程自己执行所有代码,还更好些.
好比你有一个煎鸡蛋的工作,必须厨师1去买鸡蛋,买回来之后厨师2打鸡蛋,厨师3煎鸡蛋,厨师4装盘子
你觉得效率能高么.
厨师1买回来还要先通知厨师2,厨师2如果在睡觉,还要先等他睡醒了.
为什么不让厨师1自己把活都干了?
#10
如果串口来的数据很快,而处理的慢,你可以开多个线程同时处理
比如上面的煎鸡蛋的例子中
如果厨师1一次性买回了很多鸡蛋,他自己肯定是忙不过来
那么厨师2,3,4应该同时去执行步骤2,3,4,这样才能加快效率
而不是分别去执行一个步骤.
比如上面的煎鸡蛋的例子中
如果厨师1一次性买回了很多鸡蛋,他自己肯定是忙不过来
那么厨师2,3,4应该同时去执行步骤2,3,4,这样才能加快效率
而不是分别去执行一个步骤.
#11
那么厨师2,3,4应该同时去执行步骤2,3,4,
->
厨师2先打鸡蛋,然后煎鸡蛋,然后装盘
厨师3打另一个鸡蛋,煎鸡蛋,装盘
厨师4一样
而不是厨师2只负责打鸡蛋,厨师3和4在旁边边睡觉边等
->
厨师2先打鸡蛋,然后煎鸡蛋,然后装盘
厨师3打另一个鸡蛋,煎鸡蛋,装盘
厨师4一样
而不是厨师2只负责打鸡蛋,厨师3和4在旁边边睡觉边等
#12
你是不是想抓图的数据读入的同时进行分析扫描,分析扫描同步写入分析
#13
是要提高性能吗
#14
这个东西得看你的程序了逻辑:
http://www.cnblogs.com/c6000/archive/2012/10/11/2720611.html
这个可以 帮你优化线程
http://www.cnblogs.com/c6000/archive/2012/10/11/2720611.html
这个可以 帮你优化线程
#15
#16
线程多并不代表执行速度快,效率高。
主要还是看你的设计和业务
主要还是看你的设计和业务
#1
没看懂。也许是不知道你的程序到底干什么。
1. 一个进程总是开“6个线程”,这是干什么呢?一个进程应该随着需要而使用线程。可能一瞬间需要使用30个线程,可能一瞬间只需要1个子线程,可能一段时间内根本不使用任何子线程(等待事件触发嘛)。怎么会是“循环、阻塞、死等”什么东西呢?如果你在那里“循环、阻塞、死等”,那么我相信就凭你的这个算法,真正有任务时也不可能有足够的并发能力去处理,可能因为阻塞而变慢。
2. 谁跟你说过线程的目的是“提高线程的实时性”?多线程处理,那么每一个任务单独看,肯定比顺序执行时要慢了许多。怎么可能“提高”呢?
线程的目的到底是为什么,你了解过吗?
1. 一个进程总是开“6个线程”,这是干什么呢?一个进程应该随着需要而使用线程。可能一瞬间需要使用30个线程,可能一瞬间只需要1个子线程,可能一段时间内根本不使用任何子线程(等待事件触发嘛)。怎么会是“循环、阻塞、死等”什么东西呢?如果你在那里“循环、阻塞、死等”,那么我相信就凭你的这个算法,真正有任务时也不可能有足够的并发能力去处理,可能因为阻塞而变慢。
2. 谁跟你说过线程的目的是“提高线程的实时性”?多线程处理,那么每一个任务单独看,肯定比顺序执行时要慢了许多。怎么可能“提高”呢?
线程的目的到底是为什么,你了解过吗?
#2
回答你后一个问题:“正常情况下线程间切换周期大概多长时间?”
这又无数的资料。在很多年以前,windows的桌面系统默认地“抢先式线程调度”机制,每隔几十毫秒(不超过50毫秒)就切换一次线程。现在的windows系统只可能缩短,应该不会延长。
你的问题应该是程序设计问题,不是线程切换周期长短的问题。
这又无数的资料。在很多年以前,windows的桌面系统默认地“抢先式线程调度”机制,每隔几十毫秒(不超过50毫秒)就切换一次线程。现在的windows系统只可能缩短,应该不会延长。
你的问题应该是程序设计问题,不是线程切换周期长短的问题。
#3
没看懂。也许是不知道你的程序到底干什么。
1. 一个进程总是开“6个线程”,这是干什么呢?一个进程应该随着需要而使用线程。可能一瞬间需要使用30个线程,可能一瞬间只需要1个子线程,可能一段时间内根本不使用任何子线程(等待事件触发嘛)。怎么会是“循环、阻塞、死等”什么东西呢?如果你在那里“循环、阻塞、死等”,那么我相信就凭你的这个算法,真正有任务时也不可能有足够的并发能力去处理,可能因为阻塞而变慢。
2. 谁跟你说过线程的目的是“提高线程的实时性”?多线程处理,那么每一个任务单独看,肯定比顺序执行时要慢了许多。怎么可能“提高”呢?
线程的目的到底是为什么,你了解过吗?
不好意思,没表达清楚:
A: 我是写一自动化设备控制程序+视觉处理(2个相机)
B: 控制设备运行一个线程,抓取图像 分析图像 写入分析结果各一个线程
C: 主要是有一个线程扫描IO口状态,当外部状态发生变化时,程度能即时捕获状态(硬件时钟扫描周期能满足),主要是想表达这个意思。
谢谢
#4
“线程间切换的实时性”这个概念不对头。
现在都有4个CPU了,理论上多个线程是可以并发运行的。
你要先查是哪个线程响应速度不够
现在都有4个CPU了,理论上多个线程是可以并发运行的。
你要先查是哪个线程响应速度不够
#5
在现在使用的Windows系统来说,你可以认为操作系统切换线程的时间 片是:15MS
但是记住,Windows本身是一个抢占式的操作系统.
但是记住,Windows本身是一个抢占式的操作系统.
#6
时间片大约30ms
windows谈个屁的实时性啊
想让你程序看起来更“实时”,可以拼CPU,多核超线程啥的,也可以提升进程和线程的优先级,尽量运行更少的程序。
windows谈个屁的实时性啊
想让你程序看起来更“实时”,可以拼CPU,多核超线程啥的,也可以提升进程和线程的优先级,尽量运行更少的程序。
#7
抓取图像 分析图像 写入分析结果各一个线程
你这几个线程间有执行顺序依赖关系,需要线程同步
所以多线程根本没意义.
你这几个线程间有执行顺序依赖关系,需要线程同步
所以多线程根本没意义.
#8
只能回答第三个问题:《CLR via C#》
#9
如果你开了100个线程,需要线程1执行完了再执行线程2,线程2执行完了再执行线程3...
那你不如让一个线程自己执行所有代码,还更好些.
好比你有一个煎鸡蛋的工作,必须厨师1去买鸡蛋,买回来之后厨师2打鸡蛋,厨师3煎鸡蛋,厨师4装盘子
你觉得效率能高么.
厨师1买回来还要先通知厨师2,厨师2如果在睡觉,还要先等他睡醒了.
为什么不让厨师1自己把活都干了?
那你不如让一个线程自己执行所有代码,还更好些.
好比你有一个煎鸡蛋的工作,必须厨师1去买鸡蛋,买回来之后厨师2打鸡蛋,厨师3煎鸡蛋,厨师4装盘子
你觉得效率能高么.
厨师1买回来还要先通知厨师2,厨师2如果在睡觉,还要先等他睡醒了.
为什么不让厨师1自己把活都干了?
#10
如果串口来的数据很快,而处理的慢,你可以开多个线程同时处理
比如上面的煎鸡蛋的例子中
如果厨师1一次性买回了很多鸡蛋,他自己肯定是忙不过来
那么厨师2,3,4应该同时去执行步骤2,3,4,这样才能加快效率
而不是分别去执行一个步骤.
比如上面的煎鸡蛋的例子中
如果厨师1一次性买回了很多鸡蛋,他自己肯定是忙不过来
那么厨师2,3,4应该同时去执行步骤2,3,4,这样才能加快效率
而不是分别去执行一个步骤.
#11
那么厨师2,3,4应该同时去执行步骤2,3,4,
->
厨师2先打鸡蛋,然后煎鸡蛋,然后装盘
厨师3打另一个鸡蛋,煎鸡蛋,装盘
厨师4一样
而不是厨师2只负责打鸡蛋,厨师3和4在旁边边睡觉边等
->
厨师2先打鸡蛋,然后煎鸡蛋,然后装盘
厨师3打另一个鸡蛋,煎鸡蛋,装盘
厨师4一样
而不是厨师2只负责打鸡蛋,厨师3和4在旁边边睡觉边等
#12
没看懂。也许是不知道你的程序到底干什么。
1. 一个进程总是开“6个线程”,这是干什么呢?一个进程应该随着需要而使用线程。可能一瞬间需要使用30个线程,可能一瞬间只需要1个子线程,可能一段时间内根本不使用任何子线程(等待事件触发嘛)。怎么会是“循环、阻塞、死等”什么东西呢?如果你在那里“循环、阻塞、死等”,那么我相信就凭你的这个算法,真正有任务时也不可能有足够的并发能力去处理,可能因为阻塞而变慢。
2. 谁跟你说过线程的目的是“提高线程的实时性”?多线程处理,那么每一个任务单独看,肯定比顺序执行时要慢了许多。怎么可能“提高”呢?
线程的目的到底是为什么,你了解过吗?
不好意思,没表达清楚:
A: 我是写一自动化设备控制程序+视觉处理(2个相机)
B: 控制设备运行一个线程,抓取图像 分析图像 写入分析结果各一个线程
C: 主要是有一个线程扫描IO口状态,当外部状态发生变化时,程度能即时捕获状态(硬件时钟扫描周期能满足),主要是想表达这个意思。
谢谢
你是不是想抓图的数据读入的同时进行分析扫描,分析扫描同步写入分析
#13
是要提高性能吗
#14
这个东西得看你的程序了逻辑:
http://www.cnblogs.com/c6000/archive/2012/10/11/2720611.html
这个可以 帮你优化线程
http://www.cnblogs.com/c6000/archive/2012/10/11/2720611.html
这个可以 帮你优化线程
#15
#16
线程多并不代表执行速度快,效率高。
主要还是看你的设计和业务
主要还是看你的设计和业务