C++中的多线程

来源:互联网 发布:lol网络连接失败请重试 编辑:程序博客网 时间:2024/05/23 14:49
    1.多线程程序并发的执行它自身的各个部分,多线程程序的主要问题是管理线程之间的交互。所有的进程都包含一个
执行线程,称之为主线程。主线程在程序开始时创建,然后主线程创建一个或者多个子线程。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);
得到的是一个伪句柄
 





原创粉丝点击