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

VOIDInitializeCriticalSection(LPCRITICAL_SECTION);
当一个线程使用排斥区时,调用函数:EnterCriticalSection或者TryEnterCriticalSection;
当要求占用、退出排斥区时,调用函数LeaveCriticalSection,释放对排斥区对象的占用,供其他线程使用。
MFC是微软的VC开发集成环境中提供给程序员的基础函数库,它用类库的方式将Win32API进行封装,以类的方式提供给开发者。由于其快速、简捷、功能强大等特点深受广大开发者喜爱。因此,建议使用MFC类库进行应用程序的开发。
在VC++附带的MFC类库中,提供了对多线程编程的支持,基本原理与基于Win32API的设计一致,但由于MFC对同步对象做了封装,因此实现起来更加方便,避免了对象句柄管理上的烦琐工作。
在MFC中,线程分为两种:工作线程和用户接口线程。工作线程与前面所述的线程一致,用户接口线程是一种能够接收用户的输入、处理事件和消息的线程。
工作线程编程较为简单,设计思路与前面所讲的基本一致:一个基本函数代表了一个线程,创建并启动线程后,线程进入运行状态;如果线程用到共享资源,则需要进行资源同步处理。这种方式创建线程并启动线程时可调用函数:
CWinThread*AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam,int nPriority= THREAD_PRIORITY_NORMAL,UINT nStackSize =0,DWORD dwCreateFlags=0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = 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线程进行相关操作。
注意:如果在一个类对象中创建和启动线程时,应将线程函数定义成类外的全局函数。

基于MFC的应用程序有一个应用对象,它是CWinApp派生类的对象,该对象代表了应用进程的主线程。当线程执行完并退出线程时,由于进程中没有其他线程存在,进程自动结束。类CWinApp从CWinThread派生出来,CWinThread是用户接口线程的基本类。我们在编写用户接口线程时,需要从CWinThread派生我们自己的线程类,ClassWizard可以帮助我们完成这个工作。
由于在cformview类中的初始化和cdialog类的初始化的不同(cformview类初始化时相应的控件好像还没创建),因此不能简单的在onsize函数中添加 update_easysize宏,所以在onsize中需要判断是否是第一次调用onsize函数,然后再做相应的处理,好了,话不多说,上代码:。先说说用getmodulehandle函数获取.此方法需要用createremotethread函数在远程进程中创建线程,让该线程调用kernel32.dll中的getmodulehandle函数.但是只这样还不行.因为getmodulehandle函数需要以dll模块文件名做参数.既然是远程线程调用getmodulehandle函数.还需要先把dll模块文件名写入目标进程的地址空间中.最后用createremotethread函数创建线程执行getmodulehandle函数来获取dll句柄。 } 类厂本身是一个管理组件实例化的类. 在 xpcom 中, 类厂要实现 nsifactory 接口, 它们就象上面的代码一样要使用类厂设计模式来封装对象的构造和初始化.封装构造函数 的例子是一个简单的无状态的类厂版本, 实际的编程要复杂一些, 一般的类厂都需要保存状态. 类厂至少应该保存那些对象已经被创建了的信息. 如果类厂管理的实例被存放在一个动态联接库中, 还需要知道什么时候可以卸载这个动态联接库. 当类厂保存了这样的信息, 就可以向类厂查询一个对象是否已经被创建.另一个需要保存的信息是关于单件. 如果一个类厂已经创建了一个单件类型的类, 后续的创建该单件的函数调用将返回已经创建的对象. 尽管有更好的工具和方式来管理单件, 开发人员可能仍然需要通过这种方式来保证只有一个单件对象被创建.厂模式可以完全利用函数来做, 状态可以保存在全局变量中。
3.线程同步
前面我们介绍了Win32API提供的几种有关线程同步的对象,在MFC类库中对这几个对象进行了类封装,它们有一个共同的基类CSyncObject,它们的对应关系为:Semaphore对应CSemaphore、Mutex对应CMutex、Event对应CEvent、CriticalSection对应CCriticalSection。另外,MFC对两个等待函数也进行了封装,即CSingleLock和CMultiLock。因四个对象用法相似,在这里就以CMutex为例进行说明:
创建一个CMutex对象:
CMutexmutex(FALSE,NULL,NULL);
或CMutexmutex;
当各线程要访问共享资源时使用下面代码:
CSingleLocksl(&mutex);
sl.Lock();
if(sl.IsLocked())
//对共享资源进行操作...
sl.Unlock();
结束语
同步问题2、父子线程间打开同一个文件不仅仅只是共享一个inode的问题,它们甚至还共享同一个files数据结构,也就是说文件偏移量都是共享的,那如果线程a在调用write方法的时候,如果被线程b中断又会出现什么样的问题。一个独立的程序默认是使用一个线程,windows平台的线程和类unix平台(包括linux)的进程的区别是什么呢,linux的线程编程有两个库pthread和pth,所以它拥有与unix同样平滑的处理和进程独立,由于变量本来并不共享,使程序变得更清晰与安全,每个线程在kernel中都有task结构与之对应,一个程序员很容易忘记线程之间的数据是共享的这一情况。对问题需求分析,要完成什么功能,需要处理哪些信息,要用到 哪些工具来实现,有什么困难等 程序模块 算法 数据结构 编程 调试 实现了哪些模块,运行结果如何,具备什么样的能力,存在哪些 问题,如何改进。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-106824-2.html
这也不能吃
可恨的强盗行径
只要进入12海里