C++中的多线程
1.每个进程至少包含一个执行线程,称之为主线程,再由主线程创建多个子线程。c++中没有内建的多线程的支持, 是因为效率、控制以及c++适用的应用程序的范围,但允许你直接使用操作系统提供的多线程支持。由于c++不跨平台,所以如果有内建的多线程支持的话C++就只能使用在支持多线程的环境中。
2.为了使用Windows多线程函数,需要加入<Windows.h>头文件,用CreateThread来创建一个线程。
HANDLE CreateThread(//若创建成功则返回一个句柄,失败则返回NULL,通过调用CloseHandle()来结束线程,否则它随着父线程结束LPSECURITY_ATTRIBUTES secAttr,//描述线程安全属性的指针,若为NULL则使用默认的安全描述符SIZE_T stackSize,//每个线程都有自己的堆栈,stackSize就是按字节指定这个堆栈的大小,若为0则与创建它的线程的大小一样LPTHREAD_START_ROUTINE ThreadFunc,//线程所执行的函数的地址,而这个函数的参数下面的params传入LPVOID param,DWORD flags,//确定线程的执行状态,为0则立即执行,为CREATE_SUSPEND则以挂起状态创建并等待执行,通过ResumeThread()来开始执行LPDWORD threadId//与线程有关的标识符以threadID所指向的长整型返回 );线程可以用下面的方式来手动结束:
BOOL TerminateThread(HANDLE hThread,//将要终止的线程的句柄DWORD status//终止状态 );
VOID ExitThread(DWORD status//终止状态 );
uintptr_t _beginthreadex(void *setAttr, unsigned stacksize, unsigned ( __clrcall *threadFunc )( void * ), void *param, unsigned flags, unsigned *threadID );参数的使用和CreateThread()一样,unitptr_t指定了可以拥有指针或者句柄的VC类型。
当确实需要改变程序的优先级类别时,可以调用SetPriorityClass()。可以调用GetPriorityClass()来获取当前的优先级类别。这两个函数的原型如下:
DWORD GetPriorityClass(HANDLE hApp);
BOOL SetPriorityClass(HANDLE hApp, DWORD priority);
在此,hApp是进程的句柄。GetPriorityClass()返回应用程序的优先级类别,如果失败的话,返回0。对于SetPriorityClass(),priority指定了进程的新优先级类别。
2.线程优先级: 线程优先级 | 值 |
THREAD_PRIORITY_TIME_CRITICAL | 15 |
THREAD_PRIORITY_HIGHEST | 2 |
THREAD_PRIORITY_ABOVE_NORMAL | 1 |
THREAD_PRIORITY_NORMAL | 0 |
THREAD_PRIORITY_BELOW_NORMAL | -1 |
THREAD_PRIORITY_LOWEST | -2 |
THREAD_PRIORITY_IDLE | -15 |
如果有错误发生,则GetThreadPriority()返回THREAD_PRIORITY_ERROR_RETURN。在大多数情况下,如果线程具有普通的优先级类别,
那么可以随意地改变它的优先级设置,而不必担心会给整个系统的性能带来灾难性的影响。您将会看到,在下面部分开发的线程控制面板中,
可以改变进程内线程的优先级设置(但是不能改变优先级类别)。
获取主线程的句柄:
HANDLE GetCurrentThread();
同步:可以使用互斥企业同步线程,互斥在给定的时间只允许一个线程访问某个资源。创建互斥信号量如下:
HANDLE CreateMutex(LPSECURITY_ATTRIBUTES secAttr,//安全指针,为NULL则使用默认的指针BOOL acquire,//需要互斥体的控制的话则为true,否则为falseLPCTSTR lpName//指向一个字符串,这个字符串是互斥对象的名字,有了名字之后多个就可以用这个名字取控制多个线程,若为NULL
则信号量被限制在一个线程内 );
DWORD WaitForSingleObject(//等待一个同步对象,直到这个对象可以使用或者超时之后才会返回HANDLE hObject,//互斥体的句柄DWORD dwMilliseconds//以毫秒为单位的等待时间,为INFINITE则无限等待 );
函数执行成功则返回WAIT_OBJECT_0,若超时则返回WAIT_TIMEOUT。
BOOL ReleaseMutex(//释放互斥体并允许其他线程获取它HANDLE hMutex );