zoukankan      html  css  js  c++  java
  • MutilThread 线程的创建、执行、挂起和退出

    一、线程相关API介绍
         
         在多线程操作系统中,进程是资源分配的最小单位,线程是处理器调度的最小单位,进程分配的CPU时间片又会按优先级分配给各个子线程。适当的使用多线程可以有效缩短程序完成任务的时间。在UI编程中,需要很长时间执行的后台程序放在线程中,可以保持UI界面对用户的响应。

    1.创建线程:
    HANDLE CreateThread(
      LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD(安全属性)
      SIZE_T dwStackSize,                       // initial stack size
      LPTHREAD_START_ROUTINE lpStartAddress,    // thread function(VOID *ThreadProc(PVOID))
      LPVOID lpParameter,                       // thread argument
      DWORD dwCreationFlags,                    // creation option (决定创建之后是立即执行还是挂起)
      LPDWORD lpThreadId                        // thread identifier
    );
    2.挂起线程:
    VOID Sleep(
      DWORD dwMilliseconds   // sleep time
    );
    3.退出/终止线程:
    VOID ExitThread(     // 退出当前线程
      DWORD dwExitCode   // exit code for this thread
    );
    BOOL TerminateThread(     // 在主线程中结束指定线程,导致目标线程退出,使用时要注意。
      HANDLE hThread,    // handle to thread
      DWORD dwExitCode   // exit code
    );
    
    4.获取/设置线程优先级:
    int GetThreadPriority(
      HANDLE hThread   // handle to thread
    );
    BOOL SetThreadPriority(
      HANDLE hThread, // handle to the thread
      int nPriority   // thread priority level
    );
    线程优先级nPriority参数取值,线程优先级和线程的基本优先级共同决定当前线程可以分配到多少CPU时间片。
    
    #define THREAD_PRIORITY_LOWEST          THREAD_BASE_PRIORITY_MIN       
    #define THREAD_PRIORITY_BELOW_NORMAL    (THREAD_PRIORITY_LOWEST+1)     // 正常之下,比最低优先级高1级
    #define THREAD_PRIORITY_NORMAL          0                              // 正常
    #define THREAD_PRIORITY_HIGHEST         THREAD_BASE_PRIORITY_MAX     
    #define THREAD_PRIORITY_ABOVE_NORMAL    (THREAD_PRIORITY_HIGHEST-1)    // 正常之上,比最高优先级低1级
    #define THREAD_PRIORITY_ERROR_RETURN    (MAXLONG)
    
    #define THREAD_PRIORITY_TIME_CRITICAL   THREAD_BASE_PRIORITY_LOWRT
    #define THREAD_PRIORITY_IDLE            THREAD_BASE_PRIORITY_IDLE
    
    5.获取当前线程/线程ID:
    
    HANDLE GetCurrentThread(VOID);             // 获取当前线程句柄
    
    DWORD GetCurrentThreadId(VOID);            // 获取当前线程ID
    
    6.示例代码:
    
    下面代码演示了上面的部分函数的使用方法,主线程是执行main函数,main函数中创建了两个线程分别执行两个函数,这两个函数功能基本相同打印从1到传入的int参数。
    #include <stdio.h>
    #include <windows.h>
    
    DWORD ThdProc1(PVOID param)
    {
         int times = *(int *)param;
         int i;
         for (i = 0; i < times; ++i)
         {
              Sleep(1);
              printf("Thread 1: %d\n", i);
              if(i == times/2)
              {
                   //Exit thread with DWORD type code which can be got by GetExitCodeThread() function.
                   ExitThread(99);              
              }
         }
    }
    
    DWORD ThdProc2(PVOID param)
    {
         int times = *(int *)param;
         int i;
         for (i = 0; i < times; ++i)
         {
              Sleep(1);
              printf("Thread 2: %d\n", i);
         }
    }
    
    int main(int argc, char *argv[])
    {
         HANDLE handle1,handle2;
         DWORD dwIDThread, dwExitCode;
         int times = 100;
         // Create a thread.
         handle1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThdProc1, (PVOID)&times, 0, &dwIDThread);
         // Set thread priority
         SetThreadPriority(handle1, THREAD_PRIORITY_LOWEST);
         // Create a thread with suspend state.It will not run utill the ResumeThread function is called.
         handle2 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThdProc2, (PVOID)&times, 0, &dwIDThread);
         // Suspend the primary thread a while.
         Sleep(times * 3);
         // Get the exit code setted by handle1
         GetExitCodeThread(handle1, &dwExitCode);
         printf("Thread1 exit with code:%d\n", dwExitCode);
         // Get thread priority
         printf("Thread1 priority:%d\n", GetThreadPriority(handle1));
         printf("Thread2 priority:%d\n", GetThreadPriority(handle2));
         // Resume the suspended thread.
         // Note: need the handle2 have the THREAD_SUSPEND_RESUME access to the thread.see the Thread Security and Access rights
         //ResumeThread(handle2);
         return 0;
    }
    

    二、C语言启用线程函数

    微软对C run-time library的扩充使其支持线程_beginthread和_endthread,是指更容易使用,这些函数定义在process.h头文件中。
    unsigned long _beginthread( void( __cdecl *start_address )( void * ), // 在线程中执行的函数地址
                             unsigned   stack_size,     // 分配线程堆栈大小,置0使用默认
                             void *     arglist );      // 传入线程执行函数的的参数地址
    void _endthread( void );          // 终止当前线程
    
    下面代码演示如何使用,示例代码:
    #include <stdio.h>
    #include <process.h>
    
    void ThdProc(void *pParam)
    {
         int times = *(int *)pParam;
         int i;
         for (i = 0; i < times; ++i)
         {
              printf("Thread 1: %d\n", i);
         }
         // End current thread.
         _endthread();
    }
    
    int main(int argc, char *argv[])
    {
         int nTimes = 100;
         int i;
         // Begin a new thread
         _beginthread(ThdProc, 0, &nTimes);
        
         for (i = 0; i < nTimes*2; ++i)
         {
              printf("Thread 2: %d\n", i);
         }
         return 0;
    }
    


  • 相关阅读:
    setup-nginx
    Sql Server
    第一次找工作
    JGroups 初探
    游戏与彩票
    MINA 网络黏包处理代码
    powershell遍历文件夹设置权限,解决文件无法删除的问题。
    c# 异步任务队列(可选是否使用单线程执行任务,以及自动取消任务)
    c#注册表对象映射
    最小安装centos 7 无GUI静默安装 oracle 12c,打造轻量linux化服务器
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3078706.html
Copyright © 2011-2022 走看看