极速赛车APP下载

ccriticalsection win32_win 7 windows mobile 设备中心 32位_samsung

电脑杂谈  发布时间:2019-08-31 21:07:30  来源:网络整理

win 7 windows mobile 设备中心 32位_samsung笔记本 win 7 32_ccriticalsection win32

线程是进程的一条执行模式ccriticalsection win32,它包括独立的堆栈和CPU寄存器状态,每个句柄共享所有的进程资源,包括开启的文件、信号标志及动态分配的存储等。一个进程内的所有泛型使用同一个地址空间,而这种线程的执行由平台调度程序控制,调度程序决定什么线程可执行或者什么时候执行线程。线程有优先级别,优先权较低的线程需要等到优先权较高的线程执行完后再执行。在多处理器的机器上,调度程序可将多个线程放到不同的处理器上去运行,这样可使处理器任务平衡,并提升平台的运行效益。

Windows是一种多任务的操作系统,在Windows的一个进程内包括一个或多个线程。32位Windows环境下的Win32API提供了多线程应用程序开发所必须的接口函数,而运用VC中提供的标准C库也可以研发多线程应用程序,相应的MFC类库封装了多线程编程的类,用户在研发时可按照应用程序的必须和缺点选择相应的工具。为了使你们能全面地认识Windows多线程编程技术,本文将重点介绍Win32API和MFC两种方法下怎么编制多线程程序。

多线程编程在Win32方式下和MFC类库支持下的机理是一致的,进程的主线程在任何必须的之后都可以建立新的线程。当线程执行完后,自动解除线程;当进程结束后,所有的线程都终止。所有活动的线程共享进程的资源,因此,在编程时必须考量在多个线程访问同一资源时造成矛盾的难题。当一个线程正在访问某进程对象极速赛车APP下载,而另一个线程要改变该对象,就可能会产生出错的结果,编程时要解决这个矛盾。

Win32API下的多线程编程

Win32API是Windows操作系统内核与应用程序之间的图标,它将内核提供的用途进行变量包装,应用程序通过读取相关变量而取得相应的平台功能。为了向应用程序提供多线程功能,Win32API函数集中提供了一些处理多线程程序的函数集。直接用Win32API进行程序设计具有这些特点:基于Win32的应用程序执行代码小,运行效益高,但是它要求程序员编写的代码较多,且必须管理所有平台提供给程序的资源。用Win32API直接编写程序要求程序员对Windows系统内核有必定的知道,会占用程序员很多时间对平台资源进行管控,因而程序员的工作效益提高。

1.用Win32函数创建和终止线程

Win32函数库中提供了操作多线程的变量,包括构建线程、终止线程、建立互斥区等。在应用程序的主线程或者其它活动线程中构建新的泛型的变量如下:

HANDLECreateThread(LPSECURITY_ATTRIBUTESlpThreadAttributes,DWORDdwStackSize,LPTHREAD_START_ROUTINElpStartAddress,LPVOIDlpParameter,DWORDdwCreationFlags,LPDWORDlpThreadId);

如果创建失败则返回泛型的线程,否则返回NULL。创建了新的线程后,该线程就起初启动执行了。但即使在dwCreationFlags中使用了CREATE_SUSPENDED特性,那么泛型并不马上执行,而是先挂起,等到调用ResumeThread后才开始推进线程,在这个过程中可以读取以下这个变量来修改线程的优先权:

BOOLSetThreadPriority(HANDLEhThread,intnPriority);

极速赛车APP下载当读取线程的变量返回后,线程自动解除。如果必须程的执行过程中中止则可调用函数:

VOIDExitThread(DWORDdwExitCode);

极速赛车APP下载如果程的里面终止线程,则可读取以下的函数:

BOOLTerminateThread(HANDLEhThread,DWORDdwExitCode);

但应留意:该函数可能会引起平台不稳定,而且线程所占用的资源也不释放。因此,一般状况下,建议不要使用该函数。

samsung笔记本 win 7 32_win 7 windows mobile 设备中心 32位_ccriticalsection win32

如果要中止的线程是进程内的最后一个线程,则线程被解除后相应的进程也应终止。

程体内,如果该线程完全独立,与其它线程没有数据转储等资源操作上的冲突,则可根据一般单线程的方式进行编程。但是,在多线程处理时状况一直不是这样,线程之间就会要同时访问一些资源。由于对共享资源进行访问造成矛盾是不可避免的,为了缓解这些线程同步问题,Win32API提供了多种同步控制对象来帮助程序员解决共享资源访问冲突。在介绍这种同步对象之前先介绍一下等待函数,因为所有控制对象的访问控制都要用到这个函数。

Win32API提供了一组能使线程阻塞其自身执行的等待函数。这些变量在其参数中的一个或多个同步对象造成了信号,或者达到要求的期待时间才能返回。在期待函数未返回时,线程进入等待状态,此时线程只消耗极少的CPU时间。使用等待函数既可以确保线程的同步,又可以提升程序的运行精度。最常见的等待函数是:

DWORDWaitForSingleObject(HANDLEhHandle,DWORDdwMilliseconds);

而函数WaitForMultipleObject可以用来同时监测多个同步对象,该函数的声明为:

DWORDWaitForMultipleObject(DWORDnCount,CONSTHANDLE*lpHandles,BOOLbWaitAll,DWORDdwMilliseconds);

(1)互斥体对象

Mutex对象的状况在它不被任何线程拥有时才有信号,而当它被拥有时则无信号。Mutex对象很合适拿来协调多个线程对共享资源的互斥访问。可按以下方法使用该对象:

极速赛车APP下载首先,建立互斥体对象,得到字段:

HANDLECreateMutex();

然后,程可能造成冲突的区域前(即访问共享资源之前)调用WaitForSingleObject,将数组传给变量,请求占用互斥对象:

dwWaitResult=WaitForSingleObject(hMutex,5000L);

共享资源访问结束,释放对互斥体对象的占用:

ReleaseMutex(hMutex);

互斥体对象在同一时刻只能被一个线程占用,当互斥体对象被一个线程占用时,若有另一线程想占用它ccriticalsection win32,则需要直到前一线程释放后就能顺利。

ccriticalsection win32_samsung笔记本 win 7 32_win 7 windows mobile 设备中心 32位

(2)信号对象

信号对象允许同时对多个线程共享资源进行访问,在建立对象时选定最大可同时访问的线程数。当一个线程申请访问失败后,信号对象中的计数器减一,调用ReleaseSemaphore函数后,信号对象中的计数器加一。其中,计数器值小于或等于0,但大于或等于创建时选定的最大值。如果一个应用在建立一个信号对象时,将其计数器的初始值设为0,就阻塞了其它线程,保护了资源。等初始化完成后,调用ReleaseSemaphore函数将其计数器增加至最大值,则可进行正常的存取访问。可按以下方法使用该对象:

首先,创建信号对象:

HANDLECreateSemaphore();

或者开启一个信号对象:

极速赛车APP下载HANDLEOpenSemaphore();

然后,在泛型访问共享资源之前调用WaitForSingleObject。

共享资源访问完成后,应传递对信号对象的占用:

ReleaseSemaphore();

(3)事件对象

事件对象(Event)是最简单的同步对象,它包含有信号和无信号两种状况。程访问某一资源之前,需要期待某一事件的出现,这时用事件对象最合适。例如:只有在通信端口缓冲区收到数据后,监视线程才被激活。

事件对象是用CreateEvent函数构建的。该变量可以选定事件对象的类和事件的初始状况。如果是手工重置事件,那么它总是保持有信号状钡接肦esetEvent函数重置成无信号的事件。如果是手动重置事件,那么它的状况在单个等待线程释放后会手动变为无信号的。用SetEvent可以把事件对象设定成有信号状况。在制定事件时,可以为对象命名,这样其它进程中的轮询可以用OpenEvent函数打开指定名字的事件对象句柄。

(4)排斥区对象

极速赛车APP下载在排斥区中异步执行时,它没法在同一进程的线程之间共享资源处理。虽然这时后面介绍的几种方法均可使用,但是,使用排斥区的方式则使同步管控的效益更高。

使用时先定义一个CRITICAL_SECTION结构的排斥区对象,在进程使用之前调用如下函数对对象进行初始化:

win 7 windows mobile 设备中心 32位_ccriticalsection win32_samsung笔记本 win 7 32

VOIDInitializeCriticalSection(LPCRITICAL_SECTION);

当一个线程使用排斥区时,调用函数:EnterCriticalSection或者TryEnterCriticalSection;

当规定占用、退出排斥区时,调用函数LeaveCriticalSection,释放对排斥区对象的占用,供其它线程使用。

MFC是谷歌的VC开发集成环境中提供给程序员的基础数组库,它用脚本的方法将Win32API进行封装,以类的方法提供给开发者。由于其迅速、简捷、功能超强等优点受到广大开发者喜爱。因此,建议使用MFC类库进行应用程序的开发。

极速赛车APP下载在VC++附带的MFC类库中,提供了对多线程编程的支持,基本原理与基于Win32API的设计一致,但鉴于MFC对同步对象做了封装,因此推动上去非常便于,避免了对象句柄管理上的烦琐工作。

在MFC中,线程分为两种:工作线程和客户接口线程。工作线程与上面所述的线程一致,用户接口线程是一种能够接收客户的输入、处理事件和消息的线程。

工作线程编程较为简单,设计模式与上面所讲的基本一致:一个基本变量代表了一个线程,创建并开展线程后,线程处于运行状况;如果线程用到共享资源,则必须进行资源同步处理。这种方法建立线程并开启线程时可调用函数:

CWinThread*AfxBeginThread(AFX_THREADPROCpfnThreadProc,LPVOIDpParam,intnPriority=THREAD_PRIORITY_NORMAL,UINTnStackSize=0,DWORDdwCreateFlags=0,LPSECURITY_ATTRIBUTESlpSecurityAttrs=NULL);

参数pfnThreadProc是线程执行体函数,函数原形为:UINTThreadFunction(LPVOIDpParam)。

参数pParam是释放给执行变量的参数;

参数nPriority是泛型执行权限,可选值:

THREAD_PRIORITY_NORMAL、THREAD_PRIORITY_LOWEST、THREAD_PRIORITY_HIGHEST、THREAD_PRIORITY_IDLE。

参数dwCreateFlags是泛型创建时的标志,可取值CREATE_SUSPENDED,表示线程创建后进入挂起状态,调用ResumeThread函数后句柄继续运行,或者取值“0”表示线程构建后进入运行状况。

返回值是CWinThread类对象指针,它的成员函数m_hThread为泛型数组,在Win32API方式下对泛型操作的变量参数都要求提供线程的键值,所以当线程创建后可以使用所有Win32API函数对pWinThread->m_Thread线程进行相关操作。

注意:如果在一个类对象中建立和推进线程时,应将泛型数组定义成类外的全局函数。

ccriticalsection win32_win 7 windows mobile 设备中心 32位_samsung笔记本 win 7 32

基于MFC的应用程序有一个应用对象,它是CWinApp派生类的对象,该对象代表了应用进程的主线程。当线程执行完并退出线程时,由于进程中没有其他线程存在,进程自动结束。类CWinApp从CWinThread派生出来,CWinThread是客户接口线程的基本类。我们在编写客户接口线程时,需要从CWinThread派生我们自己的线程类,ClassWizard可以帮助我们完成这个工作。

先用ClassWizard派生一个新的类,设置基类为CwinThread。注意:类的DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE宏是必需的,因为建立线程时必须动态构建类的对象。根据需要可将初始化和结束代码分别放在类的InitInstance和ExitInstance函数中。如果必须创建窗口,则可在InitInstance函数中完成。然后建立线程并开启线程。可以用两种方式来构建客户接口线程,MFC提供了两个版本的AfxBeginThread函数,其中一个用于构建用户接口线程。第二种方法分为两步进行:首先,调用线程类的构造函数创建一个线程对象;其次,调用CWinThread::CreateThread函数来构建该线程。线程创建并开启后,程变量执行过程中经常有效。如果是线程对象,则在对象删除之前,先结束线程。CWinThread已经为我们完成了线程结束的工作。

3。线程同步

前面我们介绍了Win32API提供的几种有关线程同步的对象,在MFC类库中对这几个对象进行了类封装,它们有一个共同的基类CSyncObject,它们的对应关系为:Semaphore对应CSemaphore、Mutex对应CMutex、Event对应CEvent、CriticalSection对应CCriticalSection。另外,MFC对两个等待函数也进行了封装,即CSingleLock和CMultiLock。因四个对象用法相同,在这里就以CMutex为例进行说明:

创建一个CMutex对象:

CMutexmutex(FALSE,NULL,NULL);

或CMutexmutex;

极速赛车APP下载当各线程要访问共享资源时使用以下代码:

CSingleLocksl(&mutex);

sl.Lock();

if(sl。IsLocked())

//对共享资源进行操作。。。

极速赛车APP下载sl.Unlock();

结束语

如果用户的应用程序需要多个任务同时进行相应的处理,则使用多线程是较理想的选取。这里,提醒各位留意的是在多线程编程时要非常小心处理资源共享问题或者多线程调试问题


本文来自电脑杂谈,转载请注明本文网址:
极速赛车APP下载http://www.0531mai.com/a/jisuanjixue/article-121247-1.html

    相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    极速赛车APP 极速赛车手机版下载 极速赛车手机官网 极速赛车手机版下载 极速赛车手机版下载 极速赛车手机官网 极速赛车手机官网 极速赛车手机官网 极速赛车手机官网 极速赛车双面盘