社区
进程/线程/DLL
帖子详情
线程数量的问题
tiananmen
2006-12-27 07:39:58
我一下创建了500个线程,每个线程运行完就结束,
但是,我只想保持其中的10个同时运行,
10个中的某个线程结束后再运行其它的线程,
但是正在运行的总量要一直保持在10个,
直到这500个线程都运行完毕,
不知道我说清楚了没有,
我该如何来进行控制?
感觉应该是个古老的问题,但是手边没有书,
只好先到这里问问,最好能有简单的代码。
...全文
536
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
打赏
举报
回复
使用两个不同的线程函数不就可以了吗
Python批量更改后缀名代码
# python批量更换后缀名 import os import sys #定向到目标地址 os.chdir(r'.\data') # 列出当前目录下所有的文件 files = os.listdir('./') print('files',files) #循环文件 for fileName in files: portion = os.path.splitext(fileName) # 如果后缀是.TXT if portion[1] == ".txt": #把原文件后缀名改为 xlsx ne
python 批量更改后缀名
#-*-coding:utf-8-*- import os if __name__=='__main__': old_ext=input('Please input the old ext:') new_ext=input('Please input the new ext:') for (path,dirs,filenames) in os.walk('/root/Programs'): print 'jump in to the first for/n
【Python 文件名称和后缀名的批量更改】
【代码】【Python 文件名称和后缀名的批量更改】
Python3 批量更改文件后缀名
Python3 批量更改文件后缀名 示例: # coding:utf8 import os import sys def Rename(): #Path = "F:\\test\\" # windows下的文件目录 #Path = input("请输入你需要操作的目录(格式如'F:\\test'):") Path = r"E:\hs08-oracl...
Python 常用文件操作(文件创建、遍历、移动、更改后缀名等)
1、判断文件夹是否存在,不存在则创建: import os if not os.path.exists(path): os.mkdir(path) 2、遍历文件夹中有特定格式的文件: import fnmatch img_list = fnmatch.filter(os.listdir(path), '*.png') for img in img_list : …… 3、重命名文件: import os os.rename(Old_Dir,New_Dir) 4、路径
进程/线程/DLL
15,465
社区成员
49,169
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章