并发编程领域可以抽象成三个核心问题:分工、同步和互斥。
https://blog.csdn.net/cpongo3/article/details/89026244
是整体、部分与资源的问题;
把并发编程抽象一层,你会发现当你写一个并发程序的时候,干的就是三件事:
分工:考虑的事把一个任务拆解成多少个子任务分别分配给多少个线程做呢,比如说采用并发的方式实现wordcount,那么我可能能把这个任务拆解成 1.对文件进行切割 2.对这些不同的切割分别计算它们的所包含的词的数量 3.把最后的结果输出出来。
而这三类任务,1和3在主线程中做,2就由多个线程进行并行执行。
协作:考虑的是任务启动的时机,最主要的就是任务之间的依赖关系,如同一个DAG一般,一个线程执行完了一个任务,要通知哪些后续的任务的线程开工。而对于上面的例子而言,主线程一边做着1任务,切割了一个就启动一个线程干2任务,然后等所有的2任务干完了,主线程就可以干三任务。
线程安全(互斥):分工同步考虑了程序的性能,但并发程序中准确性问题同样至关重要。从任务具体执行的角度上看,任务之间同样可能不是说能够独立运行,因为他们可能共享着变量,可能会有变量的可见性,原子性,顺序性的问题。接着上面的例子,我们在任务2中用了一个共享变量count计算词的总数,由于多个线程对count进行操作,所以可能就需要对这个count采用原子的方式进行修改,比如用锁,用CAS等等。
作者:峰_a999
链接:https://www.jianshu.com/p/df246aa3b8d6
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。