4Win32 API 多线程
1.线程函数
所有的线程必须从一个指定的函数开始执行,此函数即为线程函数
DWORD WINAPI ThreadFunc(LPVOID lpParam);
说明:线程函数返回值必须为DWORD/unsinged long,参数必须为32位值如指针/long
且线程函数必须为全局函数或静态成员函数
2.线程的创建
HANDLE createThread(LPSECURITY_ATTRIBUTES lpsa,DWORD cbstack, LPTHREAD_START_ROUTINE lpStartAddr,LPVOID lpvThreadParm,DWORD fdwCreate,LPDWORD lpIDThread);
lpsa:null 为默认安全属性,如果想让任一个子进程都可以继承该线程对象句柄,必须指定一个SECURITY_ATTRIBUTES结构,其中的bInheritHandle初始化为True;
Cbstack:表示线程为自己所用堆栈分配的地址空间大小,0表示采用默认值
lpStartAddr:线程函数
lpvThreadParm:传入线程函数的参数
fdwCreate:控制线程创建的附加标志:0表示立即执行,CREATE_SUSPENDED则系统产生线程后,初始化CPU登记CONTEXT结构的成员,准备好执行该线程函数的第一条指令,并不立即执行而是挂起线程
lpIDThread:返回赋给该新线程的ID值
3.终止线程
VOID ExtThread(UINT fuExtCode);
调用该函数的线程设置了退出码fuExtCode后,终止该线程
BOOL TerminateThread(HANDLE hThread,DWORD dwExitCode);
结束由hThread指定的线程,当某个线程不再响应时,可用其来终止。
4.设定线程的优先级
BOOL SetThreadPriority(HANDLE hThread,int nPriority);
nPriority有以下几种可选值:THREAD_PRIORITY_LOWEST,THREAD_PRIORITY_BELOW_NORMAL,THREAD_PRIORITY_NORMAL,THREAD_PRIORITY_ABOVE_NORMAL,THREAD_PRIORITY_HIGHEST
5.挂起及恢复线程
DWORD ResumeThread(HANDLE hThread);
DWORD SuspendedThread(HANDLE hThread);//如hThread占有共享资源可能导致死锁
注:挂起多少次得恢复多少次
4MFC下 多线程
线程分为两种:用户界面线程&工作线程
用户界面线程用于接收用户的输入,处理相应的事件和消息,包含一个消息处理循环如CWinApp,从CWinThread派生出来,负责处理用户输入产生的事件和消息。工作线程常用于任务处理,不要求用户输入,在后台运行。
用户界面线程的基类为CWinThread
1.用ClassWizard派生一个新的类,基类为CWinThread
2.创建线程并启动线程
1》CWinThread*AfxBeginThread(CRuntimeClass*pThreadClass,int nPriority,UINT nStackSize,DWORD dwCreateFlags,LPSECURITY_ATTRIBUTES lpSecurityAttrs);
2》调用线程类的构造函数创建一个线程对象,然后调用CWinThread::CreateThread()创建该线程
3.同步对象
CSyncObject
Csemaphore:Semaphore
Cmutex:Mutex
Cevent:Event
CCriticalSection:CriticalSection
同步对象的使用方法:
Cmutex mutex(FALSE,NULL,NULL);//Cmutex mutex;
CSingleLock s1(&mutex);
s1.Lock();
if(s1.IsLocked())
//对共享资源的操作
s1.Unlock();
//其他同步对象使用方法相同
四个同步对象的适用场合:
1.如果某个线程必须等待某些事件发生后才能存取响应资源则用CEvent
2.如果一个应用同时可以有多个线程存取相应资源则用CSemaphore
3.如果有多个应用(多个进程)同时存取相应资源则用CMutex否则用CCriticalSection