您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 资本运营 > Sleep函数在线程同步中的作用
许多资料讲到线程的同步都会提到使用同步对象,等待函数,互锁函数等等,很少具体阐述Sleep函数在线程同步的作用。但很多多线程编程都会用到Sleep函数,与同步对象,等待函数,互锁函数配合使用,这是什么缘故?看了许多关于Sleep的介绍,但还是不懂它在线程同步中的具体作用。把一个线程挂起指定时间将线程挂起,其他线程有机会运行Sleep没有任何线程同步的作用。Sleep就是把自己挂起,结束当前时间片。下面是一个两个线程排序的小程序,大家能否以它为例,讲一下其中Sleep()的作用。看过一些关于windows编程的书后,我觉得没有Sleep也可以,有互斥量和等待函数搭配的很好阿。求解释。#includestdio.h#includestdlib.h#includetime.h#includewindows.h#includeiostreamusingnamespacestd;constintm=10;intcount=0,count1=0;intr1[m],r2[m];voidbubblesort(int*r1,int);//冒泡排序voidquicksort(int*r2,int,int);//对R从s到t进行快速排序HANDLEnMutex;DWORDWINAPIThreadFunc1(LPVOIDn);//冒泡排序DWORDWINAPIThreadFunc2(LPVOIDn);//快速排序intmain(){srand(time(NULL));//初始化种子for(inti=0;im;i++){r1[i]=0;r2[i]=0;}for(inti=0;im;i++){r1[i]=rand()%100;}cout随机产生的数组为:endl;for(inti=0;im;i++){coutr1[i];}coutendl;for(inti=0;im;i++){r2[i]=r1[i];}HANDLEhTread1;HANDLEhTread2;hTread1=CreateThread(NULL,0,ThreadFunc1,NULL,0,NULL);//创建线程1hTread2=CreateThread(NULL,0,ThreadFunc2,NULL,0,NULL);//创建线程2nMutex=CreateMutex(NULL,FALSE,NULL);CloseHandle(hTread1);CloseHandle(hTread2);Sleep(6000);inta;cina;return0;}DWORDWINAPIThreadFunc1(LPVOIDn)//*线程1负责冒泡排序{bubblesort(r1,m);cout冒泡排序最后结果为:endl;for(inti=0;im;i++){coutr1[i];}coutendl;cout冒泡排序结束endl;return0;}DWORDWINAPIThreadFunc2(LPVOIDn){quicksort(r2,0,m-1);cout快速排序最后结果为:endl;for(inti=0;im;i++){coutr2[i];}coutendl;cout快速排序结束endl;return0;}voidbubblesort(int*r1,intm){inti1,j1,exchange;inttemp;for(i1=0;i1=m-1;i1++){exchange=0;for(j1=m-1;j1=i1;j1--){if(r1[j1]r1[j1-1]){WaitForSingleObject(nMutex,INFINITE);Sleep(100);temp=r1[j1];r1[j1]=r1[j1-1];r1[j1-1]=temp;exchange=1;count++;cout冒泡排序第count步后的结果:endl;for(intk1=0;k1m;k1++){coutr1[k1];}coutendl;ReleaseMutex(nMutex);}}if(exchange==0)return;}}voidquicksort(int*r2,ints,intt){inti=s,j=t;inttemp;if(st){temp=r2[s];while(i!=j){while(ji&&r2[j]=temp)j--;while(ij&&r2[i]=temp)i++;intx=r2[i];r2[i]=r2[j];r2[j]=x;}r2[s]=r2[j];r2[i]=temp;count1++;WaitForSingleObject(nMutex,INFINITE);Sleep(100);cout快速排序第count1步后的结果:endl;for(intk=0;km;k++){coutr2[k];}coutendl;ReleaseMutex(nMutex);quicksort(r2,s,j-1);quicksort(r2,j+1,t);}}不是多此一举,如果你不sleep,就会引起某些模块分不到时间片,导致锁,进而性能下降。不只是多线程,单线程的循环里面也要写sleep(1)这样的代码。同意10楼,实际程序中需要多线程的都是一些耗时的操作,而在写多线程同步的演示程序时为了简化略去了复杂的业务操作,但是这样就会导致程序执行过快,从而体现不出同步的效果,另一方面执行过快还会掩盖一些在耗时操作下才会暴露出的不使用同步导致的问题,例如火车站售票的那个例子于是在写多线程同步的程序时就加上Sleep来模拟实际使用中的耗时操作,便于清晰地体现出等待资源等等操作的效果请看一段简单的多线程代码:ThreadA(LPVOIDlp){WaitForSingleObject(hEvent,INFINITE);//WaitForSingleObject(hEvent1,INFINITE);ResetEvent(hEvent);//ResetEvent(hEvent1)......//dosomething......SetEvent(hEvent);//SetEvent(hEvent2)}ThreadB(LPVOIDlp){WaitForSingleObject(hEvent,INFINITE);//WaitForSingleObject(hEvent2,INFINITE);ResetEvent(hEvent);......//dosomethingSetEvent(hEvent);//SetEvent(hEvent1)Sleep(5000);//这个问题的关键处WaitForSingleObject(hEvent,INFINITE);//WaitForSingleObject(hEvent2,INFINITE)ResetEvent(hEvent);//ResetEvent(hEvent2);//dosomething......SetEvent(hEvent);//SetEvent(hEvent2);}我的本意是希望能够在ThreadB执行Sleep()的时候切换到ThreadA,等ThreadA执行完,再继续去执行ThreadB中Sleep()之后的代码。但是现在的情况是:当ThreadB执行Sleep()时,ThreadA并没有按想象的去执行代码。而是等待整个ThreadB函数结束以后,才开始运行。请问这是什么原因?如何解决?sleep只是当前线程放弃cpu,重新进入调度。但不保证会执行哪个。你有两个线程互相等待,应该用两个event。(看一下mfc的thrdcore.cpp,mfc线程启动afxbeginthread也用到了这种方法)。从程序看,你还存有单线程的思想,认为程序是按你想象的顺序执行,实际并非如此。sleep只会让当前线程放弃cpu,谁获得cpu是随机得
本文标题:Sleep函数在线程同步中的作用
链接地址:https://www.777doc.com/doc-2858845 .html