博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Windows多线程编程

Posted on 2011-08-24 20:38  yuanzfy  阅读(6230)  评论(0)    收藏  举报

三种实现方式

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);