首页 新闻 会员 周边 捐助

让主进程一直保有一定量的线程怎么做?

0
悬赏园豆:30 [已解决问题] 解决于 2013-11-11 23:17

问题是这样的:

主进程打开了3个大文件,然后后面要利用这3个文件做n次计算,每两个计算之间是独立的,不过大家都要用这3个文件(只读)。

我的问题是怎样让主进程一直有一定量的线程在跑,因为有的线程很快就跑完了,有的跑的特别慢,我之前写的框架是下面这样的:

 1 int i = 0;
 2 pthread_t pids[n];
 3 for (; i + 5 < n; i += 5) {
 4     struct argument arg0 = {i, ...};
 5     struct argument arg1 = {i+1, ...};
 6     ...
 7     struct argument arg4 = {i+4, ...};
 8 
 9     int err0 = pthread_create(&pids[i], thread_fn, NULL, &arg0);
10     int err1 = pthread_create(&pids[i+1], thread_fn, NULL, &arg1);
11     ...
12     int err4 = pthread_create(&pids[i+4], thread_fn, NULL, &arg4);
13 
14     if (err0 != 0 || .. || err4 != 0) {
15         ...
16     }    
17 
18     err0 = pthread_join(pids[i], NULL);
19     err1 = pthread_join(pids[i+1], NULL);
20     ...
21     err4 = pthread_join(pids[i+4], NULL);
22 
23 }
for (; i < n; ++i) {
// 处理剩下的情况,每次生成一个线程
}

由于数据的问题,有的线程不需要怎么计算,有的需要很长时间的计算,造成每次的5个线程经常会出现有4个已经结束了,大家都在等最后一个。

 

有没有什么方法能够让主进程一直保有5个线程,只要有线程计算完成,就生成新线程。

 

谢谢大家!

ziyoudefeng的主页 ziyoudefeng | 初学一级 | 园豆:122
提问于:2013-11-08 10:55
< >
分享
最佳答案
0

可以的,线程结束是知道的,在那个时候再开辟新线程

收获园豆:10
平常心队长 | 小虾三级 |园豆:1113 | 2013-11-08 11:16

能给个思路吗?

ziyoudefeng | 园豆:122 (初学一级) | 2013-11-08 11:40

@ziyoudefeng: 你要保持最高5个线程,最好是按照楼上的方法,这样你不用管理这些线程了,设置下最大线程就行了.如果开辟的多了,会在较短的线程执行完之后,自动调用等待的线程.

http://www.cnblogs.com/chinhr/archive/2008/04/15/1154444.html

这是中文版的介绍.参考下

平常心队长 | 园豆:1113 (小虾三级) | 2013-11-11 09:16
其他回答(2)
2

线程池

收获园豆:10
林J | 园豆:202 (菜鸟二级) | 2013-11-08 10:58

谢谢,线程池估计比较麻烦,我这里问题比较简单,就看看有没有什么直接的方法,也不要求代码多么可读,能干活就OK。

支持(0) 反对(0) ziyoudefeng | 园豆:122 (初学一级) | 2013-11-08 11:39

@ziyoudefeng: 恰恰相反,使用线程池正是这个需求最简单的解决方式,手动管理更复杂。

支持(0) 反对(0) 林J | 园豆:202 (菜鸟二级) | 2013-11-08 12:09

@ziyoudefeng: 线程池不是很麻烦,网上肯定有人写过,不用自己写了,看看这个:http://www.codeproject.com/Articles/7933/Smart-Thread-Pool

支持(0) 反对(0) 会长 | 园豆:12463 (专家六级) | 2013-11-08 18:03

@会长: 谢谢,今天看到一篇文章讲线程池适用于线程频繁启动,运行时间不是很长的情况。我再看看你发的这个,再思考思考我的问题是否适合线程池。有问题再问你,谢谢!!

支持(0) 反对(0) ziyoudefeng | 园豆:122 (初学一级) | 2013-11-08 21:22
1

用个List装着工作中的线程。

线程结束了从List移除。

判断List大小。

收获园豆:10
_cha1R | 园豆:403 (菜鸟二级) | 2013-11-11 16:17

这个想法不错~~

支持(0) 反对(0) ziyoudefeng | 园豆:122 (初学一级) | 2013-11-11 23:16
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册