多线程技术在云存储视图库中的应用
2015-03-19尹莉莉
尹莉莉
安徽四创电子股份有限公司,安徽合肥 230088
1 多线程的同步技术
开发人员在进行多线程编程时,为了使得各个线程能够协同工作,必须要用到线程同步技术。下面将针对临界区、事件及互斥对象这几种windows线程的同步技术进行介绍。
1.1 临界区对象
临界区其实就是一段代码,它的作用就是控制共享资源不被同时访问,比如一个线程进入临界区访问共享资源后,其他想访问该共享资源的线程将被拒绝访问,处于挂起状态,直到临界区释放后,其他线程才可以继续抢占。利用临界区对象控制线程同步的方法如下。
1)定义临界区对象,该对象是全局变量。
CRITICAL_SECTION g_s;
2)初始化临界区对象。
InitializeCriticalSection(&g_s);
3)进入临界区。
EnterCriticalSection(&g_s);
4)释放临界区。
LeaveCriticalSection(&g_s);
1.2 事件对象
事件对象是一种抽象的对象,有受信和未受信两种状态,一般和WaitForSingleObject函数一起使用,该函数根据事件的受信状态来判断是否让线程访问该共享数据。利用事件对象来保持线程同步的方法如下。
1)创建事件内核对象并保存事件对象的句柄。
HANDLE g_hEvent;//全局变量。
g_hEvent = CreateEvent(NULL,FALSE,FALSE,FALSE,NULL);
createEvent函数可根据参数传入的不同,来决定是否需要手动重置事件对象,同时也可以决定事件创建的初始状态,即受信还是未受信。
2)更改事件对象的状态。
SetEvent(g_hEvent);//设置事件状态为受信状态
ReleaseEvent(g_Event);//设置事件状态为无信号状态
3)使用WaitForSingleObject函数来控制线程对共享资源的访问。
WaitForSingleObject(g_hEvent,INFINITE);
当事件对象是受信状态时,则该线程可以访问共享资源。
1.3 互斥内核对象
互斥对象也是一种内核对象,其与前面两种保持同步的方法类似,利用该技术进行线程同步的方法如下。
1.3.1 创建互斥对象并保存对象句柄
HANDLE g_hMutex;//全局变量
g_hMutex = CreateMutex(NULL,FALSE,NULL);//第二个参数一般设置为false,表示该对象没有被任何线程所占用。
1.3.2 在线程函数中使用WaitForSingleObject
WaitForSingleObject(g_hEvent,INFINITE);
1.3.3 释放互斥对象
ReleaseMutex(g_hMutex);
2 多线程的优缺点
任何东西都有它的两面性,同样多线程也是一把双刃剑,有它的优点也有它的缺点。
首先,多线程的优点如下。
1)提高界面程序响应速度。
当一个程序既要执行耗时的任务,又要更新窗口及接受相关界面操作时,如云存储视图库的客户端界面程序,如果该程序是单线程程序,则会导致界面的卡死,从用户的角度来说,这个应用程序就像处于无响应状态一样。如果程序是多线程程序,可以把耗时任务,比如视频的点播,文件的上传下载等传递给后台线程,当后台线程在执行这些功能的时候,主线程就可以及时的处理用户对界面的操作请求,从用户的体验感上来讲,程序的响应速度就比单线程要快的多。
2)资源利用率高。
因为电脑的工作原理是轮转时间片进行操作,而操作系统中分配时间片的操作是以线程为准的,对比实现同样功能的多线程程序和单线程程序,多线程程序被分配的时间片就比单线程程序多了,从而cpu在它上面花费的时间就多了,这就充分的利用了cpu资源。比如上传下载文件,当用户上传第一个文件时,cpu会等待第一个文件上传完成,如果接下来继续上传其他文件,cpu在上传文件的同时就可以对已上传完成的文件进行下载了,因为在执行文件上传时,cpu还有很多空闲的时间,可以给下载线程分配一定的时间片来执行下载,从而提高了cpu资源的利用率。
其次,多线程的缺点如下。
1)设计复杂。
有一些多线程应用程序比单线程的应用程序要简单,但是一般情况下多线程的设计还是更复杂一点,尤其当多个线程共享进程数据的时候,需要用到同步技术,处理不当就有可能造成线程的死锁。
2)频繁切换上下文的开销。
Cpu是通过分配时间片来控制线程的交替执行的,当一个线程的时间片被用完时,cpu就要准备从该线程切换到下一个被分配到时间片的线程,此时就需要cpu记录当前线程的相关信息,如线程的相关数据,程序的地址等,这些操作完成后,cpu才可以载入另一个线程的相关数据开始执行。由此可知,如果程序是多线程程序,由于线程数量较多,系统将会花费大量的时间来处理线程的频繁切换,这就可能降低程序的执行效率。
3)资源消耗的增加。
多线程程序在充分利用cpu资源的情况下,也会加大对资源的消耗量,因为每个线程都要有自己的一个堆栈,这就加大了对内存的使用,同时程序还需要一些资源来管理线程,这些都导致了资源消耗的增加。
3 结论
综上可知,多线程的使用有利有弊,在软件开发中,到底需不需要用到多线程编程需要考虑很多因素,也需要结合程序功能的实际情况。一般情况下,多线程技术在项目开发中还是得到了广泛应用,因为在大多数项目开发中,多线程的优势还是明显大于劣势的。
[1]王艳平,Windows程序设计[M].2版.北京:人民邮电出版社,2008.
[2]章秦.Win32多线程同步技术浅析[J].电子设计工程,2011.