三种实现方式
CreateThread是Windows API库,而_beginthreadex是多线程运行时库(Multi-Threads C Runtime)。创建成功时都返回新建线程句柄。
uintptr_t _beginthread(void( __cdecl *start_address )( void * ),unsigned stack_size,void *arglist);
uintptr_t _beginthreadex(void *security,unsigned stack_size,unsigned ( __stdcall *start_address )( void * ),
   void *arglist,unsigned initflag,unsigned *thrdaddr );  
_beginthreadex最终也是调用CreateThread创建线程的,但是他更安全,而且可移植性好.
注意_beginthread和_beginthreadex线程函数地址参数不同,一个是void,一个是unsigned。
创建时flag可以赋值为0表示即刻运行,也可以赋值为CREATE_SUSPENDED,表示创建成功后挂起线程。
线程函数
线程函数必须是全局函数,或者是类的静态成员函数,因为非静态成员函数有this指针,而在进程中无法访问此指针。
但是静态成员函数只能访问静态成员,解决此问题途径:
1. 就是在调用静态成员函数时将this指针作为参数传入,通过该指针访问非静态成员。
2. 不将线程函数定义为类的静态成员函数,而是定义为类的友元函数,这样函数线程也可以有类成员函数相同的权限。
//当对象可用时线程才会被唤醒
DWORD WaitFOrSIngleObject(HANDLE hHandle,DWORD dwMilliseconds);
线程终止
1. 线程函数返回,最安全的终止方式。
2. 线程自身调用ExitThread,最好使用_endthreadex:
VOID ExitThread(UNIT ExitCode);
3. 同一进程或者其他进程的线程调用TerminateThread,最好不用,不安全:
BOOL TerminateThread(HANDLE hThread,DWORD ExitCode);
4. 主线程(主进程)终止,子线程随之终止。
进程优先级
HANDLE   handle =   OpenProcess(PROCESS_ALL_ACCESS,   false,   GetCurrentProcessId());
SetPriorityClass(handle, REALTIME_PRIORITY_CLASS);
//>HIGH>ABOVE_NORMAL>NORMAL>BELOW_NORMAL>IDLE
CloseHandle(handle);
线程优先级
HANDLE hCurrentThread=GetCurrentThread();
SetThreadPriority(hCurrentThread,nPriority);
THREAD_PRIORITY_IDLE<LOWEST<BELOW_NORMAL<NORMAL<ABOVE_NORMAL<HIGHEST<CRITICAL
others
DWORD ResumeThread(HANDLE hTHread);
线程如果挂起n次,则必须唤醒n次才能得以执行
DWORD SuspendThread(HANDLE hThread);
获得线程退出码,STILL_ACTIVE表示还在运行
BOOL WINAPI GetExitCodeThread(HANDLE hThread,LPDWORD ExitCode);
关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等。
若在线程执行完之后,没有调用CloseHandle,在进程执行期间,将会造成内核对象的泄露,相当于句柄泄露,但不同于内存泄露,这势必会对系统的效率带来一定程度上的负面影响。但当进程结束退出后,系统会自动清理这些资源。
CloseHandle(HANDLE hThread);
 
                    
                     
                    
                 
                    
                 
 
         
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号