当前位置:软件基础->软件设计 ->项目开发中使用并发模型常见问题的整理与思考

原创版权标志项目开发中使用并发模型常见问题的整理与思考

作者:阿郎  发表时间:2018/4/5 15:11:11  阅读:
[摘要] 需求: 数量不定,会定期更新数据,且数据量大的一堆数据,需要在短时间内调用某个接口获取到所有的数据,随后根据返回的json键值进行分类处理。
使用支付宝扫码领红包,余额宝付款才可以使用红包哦!不要忘记哈。每天扫一次,天天赚红包!!可以将二维码保存到手机,每天直接扫码领红包啦!!
需求: 数量不定,会定期更新数据,且数据量大的一堆数据,需要在短时间内调用某个接口获取到所有的数据,随后根据返回的json键值进行分类处理。

需求如上,初步分析,我们必然会用到多线程来做,即开一定数量的线程去调用接口获取数据,随后处理返回的json数据,这一套我们需要分开来做,调用接口获取数据我们可以看成是生产者,而处理返回的数据,将其分类就可以看作是消费者。那么,现在我们要来思考下采用这套模型可能会产生的问题。首先,如果生产者生产的数据的速度小于消费者消费的速度,那么此时,我们就需要挂起消费者线程,直到生产者生产了数据,也就是说,在生产者与消费者之间存储数据的容器,我们需要慎重选择,不能仅仅选择队列数据结构来存储,考虑到这种情况,我们可以换成阻塞队列这种数据结构来作为生产者-消费者模型的中间容器层。

    容器的问题解决了,那么接下来还需要继续分析。在此模型中,生产者一边生产数据,消费者一边消费数据,但是就算是再多的数据,也会出现获取完的时候,那么我们此时如何标记生产者已经没有数据再能生产了呢?如何将这个信息通知给消费者?不能简单地通过队列中数据的数量来判断,由于我们是一边消费一边生产的,因此队列中的数据量就会不准。我们可以引入一个线程安全的队列来记录每一次生产者生产的数据量。然后再消费者那边做一个判断,如果此时的标记队列的数量恰好就是总的数据量,那么关闭生产者线程,同时,当消费者线程消费完容器阻塞队列中的数据的时候,就完成了所有的操作,此时跳出所有的循环,不再启用线程处理。在这里我们引入了一个第三方的队列来判断,从空间以及时间来看,增加了一点内存,也耗费了大概几百ms到1s左右的时间,可以忽略,但是我们也有第二种方法来实现,那就是利用原子锁,原子锁本就是为了维护值类型即整型之类的线程安全性,我们完全可以原子锁来做实现,而且是无锁操作。

    

    具体demo,请看 Interlocked在多线程下进行原子操作无锁无阻塞的实现线程运行状态判断

微信扫码关注公众号CPP技术网,微信号cpp_coder,关注我们的公众号,阅读更多精彩内容!每天还可以领取大红包哦!!!每天还可以领取大红包哦!!!每天还可以领取大红包哦!!!
文章来源:C++技术网原创文章版权为网站和作者共同所有,会员文章禁止转载。非会员文章转载做好本文超链接即表示授权转载。通过文章下面的分享按钮可以自由分享所有文章。

返回顶部

在线提问
问题标题:
问题描述:(简陋的描述会导致问题被最后回答、没有针对性回答甚至无法解答。请确保问题描述的足够清楚。)