- 论坛徽章:
- 0
|
回复 #1 linPower 的帖子
小弟认为,能简单就简单。别把问题搞复杂。
比如,楼主大大使用常规做法,利用线程库提供的一大堆函数来完成调度。
完全没有必要。
最简单的做法,用全局数组,分别与每个线程对应。
给这个数以不同含义,通过修改这个数值,就可以达到控制线程的目的。
比如:int status[100];//0:start,1:start_recv,2:recv_ing,3:recv_end.4:........
通过这个值的变化,就简单的控制了每个线程的动作。
这么简单做的事为什么要搞那么复杂。
线程同步什么的都可以这么做。注意互斥就行了。
另外,可以使用线程函数的入口参数,来达到你要做的目的。
最后,说点题外的,个人觉得不要启动关闭线程过于频繁。最好启动的线程,通过传递参数,来完成相应任务。即使任务结束,也不要把线程结束,可以留待以后新的任务的到来,继续使用该线程。目前看到的Stevens的几本经典书籍的。它的网络模型并不好。太过于简单,来一个连接,为他启动一个新的线程,或者进程。对于资源与效率都是巨大的消耗。完全没有考虑线程一起一关的开销。当然,他的做法很经典的,对于简单初级应用,绝对没问题。
小弟现在使用的模型,是使用线程池,即一开始会启动很多线程,线程组分为不同功能,可以有专门处理接收的线程,也有专门查询连接状态的线程。也有一种说法连接池,应该就是这样吧。
当然现在linux2.6的核的epoll效率比select好多了。模型还可以再变,也没必要复杂。nginx就是使用epoll实现了5万同时在线,效率不降低,看了一下它的核心,也是很简单。
小弟可能说的有点跑题,说多了,总之,线程调度,不要想的复杂了。常规做法在小弟眼里是复杂的。
最后,小弟也不是啥牛人,只不过平时都这么做。仅供参考。 |
|