线程数量的问题

tiananmen 2006-12-27 07:39:58
我一下创建了500个线程,每个线程运行完就结束,

但是,我只想保持其中的10个同时运行,
10个中的某个线程结束后再运行其它的线程,
但是正在运行的总量要一直保持在10个,
直到这500个线程都运行完毕,


不知道我说清楚了没有,

我该如何来进行控制?

感觉应该是个古老的问题,但是手边没有书,
只好先到这里问问,最好能有简单的代码。
...全文
422 20 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
使用两个不同的线程函数不就可以了吗

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧