多线程基础 Fir

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


      
原文地址:https://www.cnblogs.com/huking/p/1545946.html