常需要c/c++程序多线程处理需求,提到多线程就离不开锁的概念,那是不是只要是多线程就需要锁呢? 针对这个多线程使用环境,描述一下涉及到的需求
(为方便仅以单机为例说事儿)
需求:一个目录下定期会生成日志,例如 /logs/info.2013110101.log ...... 需要对这些日志进行某种处理(处理逻辑可能较复杂)
方案一:
方式: 采用单进程程序,程序读一条log处理一条,然后再处理下一条。。。。。
问题: 日志生成可能很多,处理日志复杂,所以可能你刚处理完一条,已经生成N条了即处理逻辑永远跟不上日志生成部分
结论:对于简单的处理或许这个办法也可以应付,但稍微对效率要求一点,这个就不行了。
方案二:
方式:启动多个进程处理(并发方式)
问题:对读的日志文件需要加个lock来协调,
结论:需要单独一个逻辑来协调各个进程(用lock方式)
那么针对上述两种外是否有另一种更好的方式呢 ? 即可以多线程处理也不需要lock来协调? 当然可以
方法: 维护N个处理线程的队列Q(N),以使每个处理线程只读取对应队列内的数据日志进行处理,
然后有一个独立的线程(也可以多个)来读这个info.*日志文件,读取后就将这条日志分发到某个队列中(例如hash,或轮询方式等),
这样由于读取与处理相比会很快,所以可以用单线程读日志分发,多线程监控各自队列来处理
这样即可以达到效率上的要求,也省去多线程间的lock等开销。