多线程的程序是否真的需要锁?

18 篇文章 0 订阅
16 篇文章 0 订阅

常需要c/c++程序多线程处理需求,提到多线程就离不开锁的概念,那是不是只要是多线程就需要锁呢? 针对这个多线程使用环境,描述一下涉及到的需求

(为方便仅以单机为例说事儿)


需求:一个目录下定期会生成日志,例如   /logs/info.2013110101.log ......     需要对这些日志进行某种处理(处理逻辑可能较复杂)

方案一:

方式: 采用单进程程序,程序读一条log处理一条,然后再处理下一条。。。。。

问题: 日志生成可能很多,处理日志复杂,所以可能你刚处理完一条,已经生成N条了即处理逻辑永远跟不上日志生成部分

结论:对于简单的处理或许这个办法也可以应付,但稍微对效率要求一点,这个就不行了。


方案二:

方式:启动多个进程处理(并发方式)

问题:对读的日志文件需要加个lock来协调,

结论:需要单独一个逻辑来协调各个进程(用lock方式)


那么针对上述两种外是否有另一种更好的方式呢 ? 即可以多线程处理也不需要lock来协调? 当然可以



方法: 维护N个处理线程的队列Q(N),以使每个处理线程只读取对应队列内的数据日志进行处理,

然后有一个独立的线程(也可以多个)来读这个info.*日志文件,读取后就将这条日志分发到某个队列中(例如hash,或轮询方式等),

这样由于读取与处理相比会很快,所以可以用单线程读日志分发,多线程监控各自队列来处理

这样即可以达到效率上的要求,也省去多线程间的lock等开销。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值