欢迎来到天天文库
浏览记录
ID:34255954
大小:82.00 KB
页数:3页
时间:2019-03-04
《临界区(线程加锁操作)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、文档名称文档密级1临界区 不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它进行访问。每个进程中访问临界资源的那段代码称为临界区(CriticalSection)。 每个进程中访问临界资源的那段程序称为临界区(CriticalSection)(临界资源是一次仅允许一个进程使用的共享资源)。每次只准许一个进程进入临界区,进入后不允许其他进程进入。不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它进行访问。 多个进程中涉及到同一个临界资源的临界区称为相关临界区。 进程进入临界区的调度原则是:①如果有若干进程要求进入空闲的临界区
2、,一次仅允许一个进程进入。②任何时候,处于临界区内的进程不可多于一个。如已有进程进入自己的临界区,则其它所有试图进入临界区的进程必须等待。③进入临界区的进程要在有限时间内退出,以便其它进程能及时进入自己的临界区。④如果进程不能进入自己的临界区,则应让出CPU,避免进程出现“忙等”现象。 如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程可以继续抢占,并以此达到用原子方式操作共享资源的目的。 临界区在使用时以CRITICAL_SECTION结构
3、对象保护共享资源,并分别用EnterCriticalSection()和LeaveCriticalSection()函数去标识和释放一个临界区。所用到的CRITICAL_SECTION结构对象必须经过InitializeCriticalSection()的初始化后才能使用,而且必须确保所有线程中的任何试图访问此共享资源的代码都处在此临界区的保护之下。否则临界区将不会起到应有的作用,共享资源依然有被破坏的可能。 下面通过一段代码展示了临界区在保护多线程访问的共享资源中的作用。通过两个线程来分别对全局变量g_cArray[10]进行写入操作,用临界区结
4、构对象g_cs来保持线程的同步,并在开启线程前对其进行初始化。为了使实验效果更加明显,体现出临界区的作用,在线程函数对共享资源g_cArray[10]的写入时,以Sleep()函数延迟1毫秒,使其他线程同其抢占CPU的可能性增大。如果不使用临界区对其进行保护,则共享资源数据将被破坏(参见图1(a)所示计算结果),而使用临界区对线程保持同步后则可以得到正确的结果(参见图1(b)所示计算结果)。代码实现清单附下: //临界区结构对象 CRITICAL_SECTIONg_cs; //共享资源 charg_cArray[10]; UINTThrea
5、dProc10(LPVOIDpParam) { //进入临界区2021-8-6华为机密,未经许可不得扩散第3页,共3页文档名称文档密级 EnterCriticalSection(&g_cs); //对共享资源进行写入操作 for(inti=0;i<10;i++) { g_cArray=a; Sleep(1); } //离开临界区 LeaveCriticalSection(&g_cs); return0; } UINTThreadProc11(LPVOIDpParam) { //进入临界区 EnterCriticalS
6、ection(&g_cs); //对共享资源进行写入操作 for(inti=0;i<10;i++) { g_cArray[10-i-1]=b; Sleep(1); } //离开临界区 LeaveCriticalSection(&g_cs); return0; } …… voidCSample08View::OnCriticalSection() { //初始化临界区 InitializeCriticalSection(&g_cs); //启动线程 AfxBeginThread(ThreadProc10,NULL);
7、 AfxBeginThread(ThreadProc11,NULL); //等待计算完毕 Sleep(300); //报告计算结果 CStringsResult=CString(g_cArray);2021-8-6华为机密,未经许可不得扩散第3页,共3页文档名称文档密级 AfxMessageBox(sResult); } 在使用临界区时,一般不允许其运行时间过长,只要进入临界区的线程还没有离开,其他所有试图进入此临界区的线程都会被挂起而进入到等待状态,并会在一定程度上影响程序的运行性能。尤其需要注意的是不要将等待用户输入或是其他一些外界
8、干预的操作包含到临界区。如果进入了临界区却一直没有释放,同样也会引起其他线程的长时间等待。换句话说,在执行了
此文档下载收益归作者所有