您好!欢迎访问!
设置首页

Executive office
导航栏目

您所在的位置:www.7269.com > www.7269.com >

正在B线程挪用退出临界区的函数

浏览数:  发表时间:2019-09-11  

  lock cmpxchg dword ptr [ebx+4], edx; //互斥替代内核锁句柄

  movedx, eax;//建立内存锁成功后,正在同样对hEvent变量进行互斥比力后替代,以处置多个线程同时对此值进行替代的环境,只要一个可以或许成功替代

  cmpdword ptr [ebx+4], 0;//有此外线程正在期待,查抄内核锁,若是没有则进行建立

  lock cmpxchg dword ptr [ebx+4], edx; //互斥比力替代

  正在利用临界区时,一般不答应其运转时间过长,只需进入临界区的线程还没有分开,其他所有试图进入此临界区的线程城市被挂起而进入到期待形态,并会正在必然程度上影响法式的运转机能。特别需要留意的是不要将期待用户输入或是其他一些干涉的操做包含降临界区。若是进入了临界区却一曲没有,同样也会惹起其他线程的长时间期待。换句话说,正在施行了EnterCriticalSection()语句进入临界区后无论发生什么,必需确保取之婚配的LeaveCriticalSection()都可以或许被施行到。能够通过添加布局化非常处置代码来确保LeaveCriticalSection()语句的施行。虽然临界区同步速度很快,但却只能用来同步本历程内的线程,而不成用来同步多个历程中的线、 临界区的退出,不会检测能否是曾经进入的线程,也就是说,我能够正在A线程中挪用进入临界区函数,正在B线程挪用退出临界区的函数,同样是成功;

  cmpdword ptr [ebx+4], 0;//此时LockCount加1大于0的环境,暗示已有人利用此资本,要对此资本进行加内核锁

  临界区正在利用时以CRITICAL_SECTION布局对象共享资本,并别离用EnterCriticalSection()和LeaveCriticalSection()函数去标识和一个临界区。所用到的CRITICAL_SECTION布局对象必需颠末InitializeCriticalSection()的初始化后才能利用,并且必需确保所程中的任何试图拜候此共享资本的代码都处正在此临界区的之下。不然临界区将不会起到应有的感化,共享资本仍然有被的可能。

  call dword ptr [WaitForSingleObject]; //正在内核级进行期待

  2、 我正在测试临界区的时候,若是我没有挪用进入临界区的函数,间接退出的话,系统没有进行判断,可是计数发觉了改变,此时此临界区就再也用不了了,由于布局中的数据曾经乱掉了。

  //临界区布局对象 CRITICAL_SECTIONg_cs; //共享资本 charg_cArray[10]; UINTThreadProc10(LPVOIDpParam) { //进入临界区 EnterCriticalSection( //对共享资本进行写入操做 for(inti=0;i10;i++) { g_cArray[i]=a; Sleep(1); } //分开临界区 LeaveCriticalSection( return0; } UINTThreadProc11(LPVOIDpParam) { //进入临界区 EnterCriticalSection( //对共享资本进行写入操做 for(inti=0;i10;i++) { g_cArray[10-i-1]=b; Sleep(1); } //分开临界区 LeaveCriticalSection( return0; } …… voidCSample08View::OnCriticalSection() { //初始化临界区 InitializeCriticalSection( //启动线程 AfxBeginThread(ThreadProc10,NULL); AfxBeginThread(ThreadProc11,NULL); //期待计较完毕 Sleep(300); //演讲计较成果 CStringsResult=CString(g_cArray); AfxMessageBox(sResult); }

  lock xadd dword ptr [ebx], eax; //进行互换自减互换操做,运转后,eax中是第一操做数先前的值,此值用会前往用来判断能否多挪用了ReleaseLock

  每个历程中拜候临界资本的那段代码称为临界区(Critical Section)(临界资本是一次仅答应一个历程利用的共享资本)。每次只答应一个历程进入临界区,进入后不答应其他历程进入。非论是硬件临界资本,仍是,多个历程必需互斥地对它进行拜候。

  声明:百科词条人人可编纂,词条建立和点窜均免费,毫不存正在及代办署理商付费代编,请勿上当。详情

  有多个线程试图同时拜候临界区,那么正在有一个线程进入后其他所有试图拜候此临界区的线程将被挂起,并一曲持续到进入临界区的线程分开。临界区正在被后,其他线程能够继续抢占,并以此达到用原子体例操做共享资本的目标。

  下面通过一段代码展现了临界区正在多线程拜候的共享资本中的感化。通过两个线程来别离对全局变量g_cArray[10]进行写入操做,用临界区布局对象g_cs来连结线程的同步,并正在线程前对其进行初始化。为了使尝试结果愈加较着,表现出临界区的感化,正在线程函数对共享资本g_cArray[10]的写入时,以Sleep()函数延迟1毫秒,使其他线程同其抢占CPU的可能性增大。若是晦气用临界区对其进行,则共享资本数据将被(拜见图1(a)所示计较成果),而利用临界区对线程连结同步后则能够获得准确的成果(拜见图1(b)所示计较成果)。

  2、任何时候,处于临界区内的历程不成多于一个。如已有历程进入本人的临界区,则其它所有试图进入临界区的历程必需期待。

  指的是一个拜候共用资本(例如:共用设备或是共用存储器)的法式片段,而这些共用资本又无法同时被多个线程拜候的特征。当程进入临界区段时,其他线程或是历程必需期待(例如:bounded waiting 期待法),有一些同步的机制必需正在临界区段的进入点取分开点实现,以确保这些共用资本是被互斥获得利用,例如:semaphore。只能被单一线程拜候的设备,例如:打印机。

  lock incdword ptr [ebx];//对LockCount进行加锁加,多CPU时的独一性,

  jeLRET1;//若是LockCount加1为0的话,暗示没有人正在利用资本,同时操纵的互斥加对资本进行占用。



Copyright 2019-2022 http://www.cheers100.cn 版权所有 未经协议授权禁止转载