昨天发了那个吹牛的文章,一不注意把今天推送文章的机会用掉了,所以我现在(PM 8:50)虽然已准备好,但也发不出来,抱歉,说好的今天发线程同步的内容只等到明天凌晨了.
今天的文章里没有故事,但应该也足够通俗易懂.
正文开始
这个世界显然不仅存在竞争,也无处不存在着合作,计算机的世界里也是这样.还是举一个简单不过的例子:
一个线程负责计算(比如1+1),另一个线程负责结果输出(显示2),其实这是经典的生产者-消费者模型(专业叫法是不是感觉高大上?),这里不懂不要紧,以后我们在数据结构与算法,网络通讯等章节中还会讲,这真是很常见的应用,作为职业的班子必然需要牢牢牢牢牢牢掌握.
这两个线程是合作的关系,一个负责计算一个负责输出结果.这两个线程之间又存在着严谨的秩序关系或者叫依赖关系,负责输出结果的线程必须等待计算线程作完成计算工作,才能够输出有意义的结果,否则就可能输出错误的结果(为什么说可能呢?知道的筒子留言我,答对了有惊喜哦).在经典教材中,将这种依赖关系称之为线程同步.
现在知道了线程需要同步也就是合作才能正确高效的完成特定任务,那么如何来实现呢?这个简单,用两个线程都知道的标记M来标识计算工作是否完成,在计算线程未完成计算工作时M的值为0,完成计算工作后,将M的值修改为1,那负责输出结果的线程就定期去看看M是否为1,如果不是1,就休息一会儿,一旦发现为1,立即去做输出结果的工作.
真的很简单?
仔细想想看,这种方法有没有什么问题?当然有.
定期查看的时间间隔是多久?1秒还1分钟,多少合适呢?这取决于具体业务的精度要求.现代操作系统当然,都完全考虑了这种需要,提供了一种叫做信号量的东西,专门完成这个工作.由于是操作系统内置的机制,因此效率也比咱们自己使用一个标记要高,而且及时性也非常好.
但万事无绝对,究竟是使用哪一种办法取决实际的业务,如此对及时性要求比较高或者说越及时越好,就最好使用信号量.反之,如果延迟一个一秒两秒无所谓,甚至延迟十秒二十秒都无所谓,那么显然就采取定期查看标记值的方法就足够了.
讲了简单的线程同步后,我们说一说高大上的云计算,好厉害啊,云计算.但说穿了,就不会显得那么神.也许,你听有一个词儿叫分布式计算,十几年前就有了,如今只是换了一个名词而已.
额,可这与线程同步有什么关系?
云计算一般用于完成一个大型的复杂的任务,而这个复杂的任务可以将其分成若干个子任务(有一种叫作MapReduce的工具专门用来分解任务,参考吴军书籍《数学之美》),然后把这些子任务放到互联网上的一些计算中心去完成,从而完成以往需要超级计算机才能够完成的任务.但一些关键任务的计算就必须等某些子任务完成后才可以继续,这可以叫作任务同步,与线程同步的本质是不是一回事儿?
当然是.
(完)
下期预告:
后天要发的文章是《两个金箍棒--线程死锁问题》,这也是复杂系统中多线程合作时常见的问题,必须理解。
敬请期待......
您的关注,留言,转发是我努力写好文章的动力!
领取专属 10元无门槛券
私享最新 技术干货