多线程开发思想之:同步运行与异步运行

回想我自己第一次开发多线程程序的时候,工程项目文件都建立好了,才打开《MFC windows程序设计》,正襟危坐的翻到多线程一章,边看边写。看来看去,暗自觉得,多线程也不过尔尔嘛,还以为是什么高深的技术。后来这种想法在写那个程序的过程中彻底破灭,就因为没有掌握牢多线程的知识就上手开发,频频崩溃,调试得头疼。最后用了一大堆全局变量,才得以平稳的运行。从来不用全局变量的我,用了那么多全局变量,心里很难受啊,像蚂蚁叮咬一样。

我写程序向来都是想怎么写,马上就下手,自己边想边摸索。现在想想自己写的第一个多线程程序,SQL密码暴力破解器,对多线程的使用方式,特别扭。在这个程序中,最初,由主线程读取字典文件,平均分成四份保存于四个全局变量中。然后开四个线程,每个线程读它自己的字典数据,然后进行尝试连接SQL服务器进行破解。四个线程异步运行,这样有好处也有坏处。

线程异步运行:

优点:四个线程根本不需要做同步,在这个程序中我一个同步对象也没用。四个线程分别用四个全局变量,其它变量都是在各自的堆栈中,互不干扰。并且由于不需要同步,每个线程一直都处于运行状态,不会出现被锁、等待排队访问数据的情况,效率很高。

缺点:虽然处理的数据量都相同,但由于windows系统分别给线程的时间片有实时差异,CPU占用也有实时差异。导致有的线程先处理完结束了,而有的线程还慢吞吞的还有很多数据没处理。这样白白浪费了很多时间。

修改线程数量麻烦,线程的数量在编译时就得决定好了,改为8线程、16线程或更多的话,还要重新修改源代码。

待处理数据需要根据线程数量平均分配,还要处理平均分配后的断开处,增加了代码编写的复杂性。

线程同步运行:

如果把字典数据保存在一个全局变量里,再用一个全局变量标记读到哪里了。多个线程通过互斥量等同步对象进行同步,排队读取字典数据,又各自尝试连接SQL服务器进行破解。多个线程同步运行。

优点:待处理数据就放一个变量里,不用为怎么平均分割,分割不齐而烦恼,代码编写较简单。

所有线程几乎同一时间处理结束退出,不存在早早的就有线程先结束,有的慢慢的还在后面的情况。时间上得到了充分利用。间接提高了效率。

可以轻松的自定义线程数量,想要多少个线程运行,就调用多少次BeginThread,相当方便。开发出的程序用户可以根据机器性能自己选择开启的线程数量。

缺点:由于做了线程同步,在访问同一个全局变量时需要排队访问,效率上略降低。

线程同步要多加注意,多加小心,稍微同步不好,漏了一些细节,就可以让你调试上大半天。

 

不管同步运行还是异步运行,在合适的情况下选择合适的方式即可。

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/CharlesSimonyi/article/details/8666295
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页