1.多线程程序并发的执行它自身的各个部分,多线程程序的主要问题是管理线程之间的交互。所有的进程都包含一个
执行线程,称之为主线程。主线程在程序开始时创建,然后主线程创建一个或者多个子线程。c++没有包含任何对多线程应用程序的内建支持,它依赖于操作系统提供的特性。c++允许直接使用操作系统提供的多线程特性。
windows API提供了CreateThread()函数来创建一个线程。函数原型如下:
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpsa,
DWORD cbStack,
LPTHREAD_START_ROUTINE lpStartAddr,
LPVOID lpvThreadParam,
DWORD fdwCreate,
LPDWORD lpIDThread
);
参数:
lpThreadAttributes:指向SECURITY_ATTRIBUTES型态的结构的指针。在Windows 98中忽略该参数。在Windows NT 中,它被设为NULL,表示使用缺省值。
dwStackSize,线程堆栈大小,一般=0,在任何情况下,Windows根据需要动态延长堆栈的大小。
lpStartAddress,指向线程函数的指针,形式:@函数名,函数名称没有限制,但是必须以下列形式声明:
DWORD WINAPI ThreadProc (LPVOID lpParam) ,格式不正确将无法调用成功。
lpParameter:向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为NULL。
dwCreationFlags :线程标志,可取值如下
(1)CREATE_SUSPENDED-----创建一个挂起的线程,
(2)0---------------------------------表示创建后立即激活。
lpThreadId:保存新线程的id。
返回值:
函数成功,返回线程句柄;函数失败返回false。
可以调用CloseThread()来显示销毁这个线程,否则在父进程结束时自动销毁。
还可以使用以下函数:
VOID ExitThread(
DWORD dwExitCode
); //用来终止调用了该函数的线程,早功能上等价于允许线程函数正常返回。
BOOL TerminateThread(
HANDLE hThread, //要终止的线程句柄
DWORD dwExitCode
);//立刻终止线程
_endthreadex()替换,需要头文件<process.h>,下面是函数原型:
uintptr_t _beginthreadex(
void *security,
unsigned stack_size,
unsigned ( *start_address )( void * ),//回调函数
void *arglist,//传递给回调函数的参数
unsigned initflag,
unsigned *thrdaddr
);
void _endthreadex(
unsigned retval
);
功能与参数含义大体与CreateThread()和ExitThread()相同。
HANDLE hThread); //挂起
DWORD ResumeThread(
HANDLE hThread);//恢复
每个执行的线程都有与其相关的挂起计数,如果计数为0则不会挂起,计数为非0值则挂起。发生错误,反悔-1;
(1)进程优先级别:
ABOVE_NORMAL_PRIORITY_CLASS
BELOW_NORMAL_PRIORITY_CLASS
HIGH_PRIORITY_CLASS
IDLE_PRIORITY_CLASS
NORMAL_PRIORITY_CLASS
REALTIME_PRIORITY_CLASS
可以用一下函数获取或者设置进程优先级:
DWORD WINAPI GetPriorityClass(
HANDLE hProcess);
BOOL WINAPI SetPriorityClass(
HANDLE hProcess,
DWORD dwPriorityClass);
(2)线程优先级别
THREAD_PRIORITY_TIME_CRITICAL
THREAD_PRIORITY_HIGHEST
THREAD_PRIORITY_ABOVE_NORMAL
THREAD_PRIORITY_NORMAL
THREAD_PRIORITY_BELOW_NORMAL
THREAD_PRIORITY_LOWEST
THREAD_PRIORITY_ABOVE_IDLE
THREAD_PRIORITY_IDLE
可以用一下函数获取或者设置线程优先级:
int GetThreadPriority(
HANDLE hThread);
BOOL SetThreadPriority(
HANDLE hThread,
int nPriority);
得到的是一个伪句柄
执行线程,称之为主线程。主线程在程序开始时创建,然后主线程创建一个或者多个子线程。c++没有包含任何对多线程应用程序的内建支持,它依赖于操作系统提供的特性。c++允许直接使用操作系统提供的多线程特性。
2.windows线程函数
(1)线程的创建和终止windows API提供了CreateThread()函数来创建一个线程。函数原型如下:
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpsa,
DWORD cbStack,
LPTHREAD_START_ROUTINE lpStartAddr,
LPVOID lpvThreadParam,
DWORD fdwCreate,
LPDWORD lpIDThread
);
参数:
lpThreadAttributes:指向SECURITY_ATTRIBUTES型态的结构的指针。在Windows 98中忽略该参数。在Windows NT 中,它被设为NULL,表示使用缺省值。
dwStackSize,线程堆栈大小,一般=0,在任何情况下,Windows根据需要动态延长堆栈的大小。
lpStartAddress,指向线程函数的指针,形式:@函数名,函数名称没有限制,但是必须以下列形式声明:
DWORD WINAPI ThreadProc (LPVOID lpParam) ,格式不正确将无法调用成功。
lpParameter:向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为NULL。
dwCreationFlags :线程标志,可取值如下
(1)CREATE_SUSPENDED-----创建一个挂起的线程,
(2)0---------------------------------表示创建后立即激活。
lpThreadId:保存新线程的id。
返回值:
函数成功,返回线程句柄;函数失败返回false。
可以调用CloseThread()来显示销毁这个线程,否则在父进程结束时自动销毁。
还可以使用以下函数:
VOID ExitThread(
DWORD dwExitCode
); //用来终止调用了该函数的线程,早功能上等价于允许线程函数正常返回。
BOOL TerminateThread(
HANDLE hThread, //要终止的线程句柄
DWORD dwExitCode
);//立刻终止线程
3.Visual C++对CreateThread()和ExitThread()的替换。
在visual C++中使用CreateThread()和ExitThread()会泄漏少量内存,因此Visual C++用_beginthreadex()和_endthreadex()替换,需要头文件<process.h>,下面是函数原型:
uintptr_t _beginthreadex(
void *security,
unsigned stack_size,
unsigned ( *start_address )( void * ),//回调函数
void *arglist,//传递给回调函数的参数
unsigned initflag,
unsigned *thrdaddr
);
void _endthreadex(
unsigned retval
);
功能与参数含义大体与CreateThread()和ExitThread()相同。
4.线程的挂起与恢复
DWORD SuspendThread(HANDLE hThread); //挂起
DWORD ResumeThread(
HANDLE hThread);//恢复
每个执行的线程都有与其相关的挂起计数,如果计数为0则不会挂起,计数为非0值则挂起。发生错误,反悔-1;
5.改变线程优先级
线程的优先级由进程的优先级以及各个线程的优先级的组合确定。(1)进程优先级别:
ABOVE_NORMAL_PRIORITY_CLASS
BELOW_NORMAL_PRIORITY_CLASS
HIGH_PRIORITY_CLASS
IDLE_PRIORITY_CLASS
NORMAL_PRIORITY_CLASS
REALTIME_PRIORITY_CLASS
可以用一下函数获取或者设置进程优先级:
DWORD WINAPI GetPriorityClass(
HANDLE hProcess);
BOOL WINAPI SetPriorityClass(
HANDLE hProcess,
DWORD dwPriorityClass);
(2)线程优先级别
THREAD_PRIORITY_TIME_CRITICAL
THREAD_PRIORITY_HIGHEST
THREAD_PRIORITY_ABOVE_NORMAL
THREAD_PRIORITY_NORMAL
THREAD_PRIORITY_BELOW_NORMAL
THREAD_PRIORITY_LOWEST
THREAD_PRIORITY_ABOVE_IDLE
THREAD_PRIORITY_IDLE
可以用一下函数获取或者设置线程优先级:
int GetThreadPriority(
HANDLE hThread);
BOOL SetThreadPriority(
HANDLE hThread,
int nPriority);
6.获取当前线程的句柄
HANDLE GetCurrentThread(void);得到的是一个伪句柄