zoukankan      html  css  js  c++  java
  • 多线程基础 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


          
  • 相关阅读:
    linux下解除端口占用
    设计模式(二)观察者模式
    设计模式(一) 策略模式
    loj #6235. 区间素数个数
    loj #2013. 「SCOI2016」幸运数字
    loj #6014. 「网络流 24 题」最长 k 可重区间集
    loj #6013. 「网络流 24 题」负载平衡
    loj #2255. 「SNOI2017」炸弹
    loj #2051. 「HNOI2016」序列
    loj #6122. 「网络流 24 题」航空路线问题
  • 原文地址:https://www.cnblogs.com/huking/p/1545946.html
Copyright © 2011-2022 走看看