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


          
  • 相关阅读:
    Java Native Method
    SQL语句优化
    Ibatis的环境搭建以及遇到的问题解决
    Java 构建器
    SpringMVC自定义视图 Excel视图和PDF视图
    java 枚举的常见使用方法
    mysql 根据某些字段之和排序
    MFC The Screen Flickers When The Image Zoomed
    How To Debug Qmake Pro File
    Gcc And MakeFile Level1
  • 原文地址:https://www.cnblogs.com/huking/p/1545946.html
Copyright © 2011-2022 走看看