多线程编程请教
最近对我们的程序进行优化。该程序进程,分为多个线程,分别是:epoll线程;数据读取并且转为msg线程;处理msg的业务线程;在业务线程中(一个),由于有多个socket链接,存在多个msg队列;所以,在每一个循环中,需要分别遍历这几个队列。在处理完一轮之后,会sleep下。
那么,是不是一定要sleep?(同事做过实验,没有sleep的话,cpu会到100%,这是为什么?)
是否有sleep的替代方案?
合并为一个队列然后等在信号量上不就行了吗 man eventfd, 2.6.27+ 一般结构为while(true) {...} 不sleep的话就是不停的跑,当然要耗尽cpu了; 加上sleep那怕只停10ms,效果就不一样;cpu会在这段时间内执行其他线程 CPU调度默认为基于进程优先级的抢占机制。 一个线程没有进入pending的话,别的线程无法得到执行。SLEEP就是让线程进入PENDING一段时间,其他线程就可以抢占CPU得到执行。
不SLEEP的话,线程的状态一直是RUNNING,这个状态禁止别的线程运行。 回复 2# sonicling
原来架构如此,改起来工作量很大;而且,也不一定合适这么改
回复 3# hanxin83
什么意思?不明白
回复 5# cenifly
谢谢你的回复。就是说,sleep是必须,暂时没有更好的方案
knull 发表于 2015-03-26 21:55 static/image/common/back.gif
最近对我们的程序进行优化。该程序进程,分为多个线程,分别是:epoll线程;数据读取并且转为msg线程;处理 ...
糟糕的架构。 回复 1# knull
msg是ipc的消息队列吗?统一进程内没必要这么做吧
同一进程,可以维护一个数据的链表,然后用锁和条件变量来保护,这样就不需要sleep,响应速度更快,而且不存在msg缓冲满掉或者CPU空跑的情况,简单示意如下:
读取的线程读取到数据,加锁插入该链表中,然后通知条件变量;
处理的线程:1,对链表加锁;2,判断是否有数据;3,如果有,取出,解锁,处理,然后再回到1;4,如果无,等待条件变量(pthread_cond_wait不一直消耗CPU),等待成功回到2;
如果C++可以将以上的链表结构、插入、取出含判断等待等封装成一个类使用,如果C的话,分别用对应的结构体、变量和函数实现
页:
[1]
2