社区
进程/线程/DLL
帖子详情
线程数量的问题
tiananmen
2006-12-27 07:39:58
我一下创建了500个线程,每个线程运行完就结束,
但是,我只想保持其中的10个同时运行,
10个中的某个线程结束后再运行其它的线程,
但是正在运行的总量要一直保持在10个,
直到这500个线程都运行完毕,
不知道我说清楚了没有,
我该如何来进行控制?
感觉应该是个古老的问题,但是手边没有书,
只好先到这里问问,最好能有简单的代码。
...全文
515
20
打赏
收藏
线程数量的问题
我一下创建了500个线程,每个线程运行完就结束, 但是,我只想保持其中的10个同时运行, 10个中的某个线程结束后再运行其它的线程, 但是正在运行的总量要一直保持在10个, 直到这500个线程都运行完毕, 不知道我说清楚了没有, 我该如何来进行控制? 感觉应该是个古老的问题,但是手边没有书, 只好先到这里问问,最好能有简单的代码。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
20 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
tiananmen
2007-01-06
打赏
举报
回复
谢谢大家,搞定了,
用的是 Semaphore,标志成10个就OK了。
结贴
zdleek
2007-01-05
打赏
举报
回复
上面已经有很多方法,楼主随意挑一个方案就可达到自己的目的
MLiang
2007-01-05
打赏
举报
回复
Semaphore
Analyst
2007-01-04
打赏
举报
回复
开个线程池,设定最大线程数为10,然后往里面添加500个任务即可。
microyzy
2007-01-04
打赏
举报
回复
这个问题干吗要自己调度?不太明白,mark一下
个人认为其实是个资源抢占的问题,创建一个值为10的信号灯,最初抢到信号灯的10个线程先运行,没有抢到的等待信号灯,抢到的运行结束后释放,其他的由系统调度就行
会思考的草
2006-12-30
打赏
举报
回复
如果要自己调度自己创建的线程的话,就只能用fiber了。
会思考的草
2006-12-30
打赏
举报
回复
Fiber当然可以在windows下用了,不过好像只能在2k以上系统中?记不清楚了。
Fiber其实就是用户级线程,其调度归用户管理,kernel不知道这些线程的存在及其数量。Windows中的Thread其实是Kernel level thread,其调度由kernel管理。
thread可以转换成fiber,很容易的。
blastzgd
2006-12-30
打赏
举报
回复
找到答案:
Widnows 是提供了用户级线程的,类似 coroutine 需要用户主动是切换。这在单线程程序中非常有用。线程调度模块只负责提供堆栈,环境的保存。不负责分配时间片等。
自己实现 coroutine 并不难,但能用操作系统提供的可以得到更多的便利。Windows 中把这种用户级线程叫做 Fiber,纤维的意思。比较通用的译名是纤程。
我们可以把一个 thread 转换成一个 fiber ,用到的 API 是 ConvertThreadToFiber。其实用的更多的是CreateFiber,它可以创建一个纤程,但并不切换过去运行。
被创建出来的 Fiber 会有一个上下文的地址被返回,用于以后的切换操作。我们可以用 SwitchToFiber 来切换。这是唯一用于 Fiber 释放操作权的途径。SwitchToFiber 必须显式的指定切换的目标,所以 Fiber 调度的工作需要我们自己写代码来实现。
但是,SwitchToFiber的调用者也必须是纤程,也就是说必须在创建的纤程内使用这个函数,好像光是使用纤程也不能对楼主所提的问题有所帮助吧.还是一样要用到其它的同步办法.
blastzgd
2006-12-30
打赏
举报
回复
没用过,所以问下,高手请回答.
blastzgd
2006-12-30
打赏
举报
回复
楼上,Fiber能在Windows下用么?
会思考的草
2006-12-29
打赏
举报
回复
用Fiber吧。
trueadou
2006-12-29
打赏
举报
回复
使用CSemaphore是个不错的主意!
鄢老
2006-12-29
打赏
举报
回复
我的想法是,先要一个管理线程序,然后再设置一个互锁函数,来标志其标量的以后十个线程在运行,而在管理线程中要不断检查这10个线程是否运行完毕,运行完之后标志加10,再运行下10个线程。等标志加到499的时候,你根据实际情况另行处理。
dirdirdir3
2006-12-28
打赏
举报
回复
使用CSemaphore来控制同时运行的数量
南风1
2006-12-28
打赏
举报
回复
同意楼上的
另外设置一个计数器,到500时停止创建。
surnde
2006-12-28
打赏
举报
回复
第一次开10个线程,然后在线程结束时再创建一个新线程
这样就保持了10个线程。
blastzgd
2006-12-28
打赏
举报
回复
dirdirdir3(风) ( ) 信誉:100 Blog 2006-12-28 11:33:29 得分: 0
使用CSemaphore来控制同时运行的数量
tiananmen
2006-12-27
打赏
举报
回复
没明白你的意思
ProgrameMan
2006-12-27
打赏
举报
回复
使用两个不同的线程函数不就可以了吗
线程
数量
的设计
问题
,以及
线程
池的创建
本文探讨了如何根据任务类型设置
线程
数量
,对于CPU密集型任务建议
线程
数=核心数N+1,IO密集型任务则推荐
线程
数=核心数N*2+1。在实际应用中,
线程
数应考虑任务的CPU时间和等待时间。Java中创建
线程
池主要通过Executors工厂方法或直接使用ThreadPoolExecutor。
线程
池的核心参数包括:corePoolSize(核心池大小)、maximumPoolSize(最大
线程
数)、keepAliveTime(空闲
线程
存活时间)和workQueue(阻塞队列)。
线程
池的拒绝策略也在调整
线程
数量
时需考虑。
记一次开发中遇到的
问题
:限制
线程
执行的
数量
博客讨论了在处理并发请求时如何限制
线程
执行,以避免对服务器造成过大压力。文章提到了使用CountDownLatch的潜在
问题
,包括
线程
同时执行和
线程
挂掉导致的资源未释放。随后提出了使用阻塞队列(LinkedBlockingQueue)和AtomicInteger作为超时时间的解决方案,以确保只有一个
线程
在执行并能处理
线程
挂掉的情况。此外,还介绍了Semaphore作为另一种限制
线程
数量
的工具,用于控制并发执行的
线程
数。
亲身经历:软件
线程
数量
超过硬件
线程
数量
造成的性能
问题
本文分享了一个在实现任务调度系统时因多创建
线程
而导致性能
问题
的亲身经历,并通过修正优化了执行时间,同时引用了相关理论解释。
newFixedThreadPool
线程
池
数量
问题
本文探讨了
线程
池在并发编程中的应用及调优技巧。通过对不同类型的负载(CPU密集型与IO密集型)设置合适的
线程
池大小,显著提高了程序的执行效率。文章还分享了一个实际案例,展示了如何通过调整
线程
池大小来解决具体
问题
。
线程
数量
问题
以及
线程
实现的第二种方式
本文探讨了Python中使用
线程
进行并发任务处理的方法,包括
线程
数量
的监控及
线程
执行顺序的不确定性。通过具体代码示例,展示了如何创建
线程
、启动
线程
以及监测当前运行的
线程
数量
。
进程/线程/DLL
15,465
社区成员
49,169
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章