当前位置:C++技术网 > 资讯 > 项目开发中使用并发模型常见问题的整理与思考

项目开发中使用并发模型常见问题的整理与思考

更新时间:2018-04-05 15:11:12浏览次数:1+次

需求: 数量不定,会定期更新数据,且数据量大的一堆数据,需要在短时间内调用某个接口获取到所有的数据,随后根据返回的json键值进行分类处理。

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

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

    

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