问题是这样的:
主进程打开了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: 你要保持最高5个线程,最好是按照楼上的方法,这样你不用管理这些线程了,设置下最大线程就行了.如果开辟的多了,会在较短的线程执行完之后,自动调用等待的线程.
http://www.cnblogs.com/chinhr/archive/2008/04/15/1154444.html
这是中文版的介绍.参考下
线程池
谢谢,线程池估计比较麻烦,我这里问题比较简单,就看看有没有什么直接的方法,也不要求代码多么可读,能干活就OK。
@ziyoudefeng: 恰恰相反,使用线程池正是这个需求最简单的解决方式,手动管理更复杂。
@ziyoudefeng: 线程池不是很麻烦,网上肯定有人写过,不用自己写了,看看这个:http://www.codeproject.com/Articles/7933/Smart-Thread-Pool
@会长: 谢谢,今天看到一篇文章讲线程池适用于线程频繁启动,运行时间不是很长的情况。我再看看你发的这个,再思考思考我的问题是否适合线程池。有问题再问你,谢谢!!
用个List装着工作中的线程。
线程结束了从List移除。
判断List大小。
这个想法不错~~