win32多线程的相关函数使用总结

/*****请看代码实例一:CreateThread的实现方式******/

#include <iostream>
#include<windows.h>
using namespace std;
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
 cout<<"GetCurrentThreadId()="<<GetCurrentThreadId()<<endl;
 int n=(int)lpParameter;
 while (n--)
 {
  cout<<"this is a test"<<endl;
  Sleep(1000);
 }
 return 1000;
}
int main()
{
 DWORD dwThreadId;
 HANDLE hThread=CreateThread(NULL,0,ThreadProc,(LPVOID)5,/*CREATE_SUSPENDED*/0,&dwThreadId);
 cout<<"dwThreadId="<<dwThreadId<<endl;
 if (hThread==NULL)
 {
  cout<<"error with code"<<GetLastError()<<endl;
  exit(1);
 }  

       /*1、如何使线程处于挂起状态*/
 /************第一种方法*****************/
 //1、设置参数CREATE_SUSPENDED
 //CreateThread(NULL,0,ThreadProc,(LPVOID)5,CREATE_SUSPENDED,&dwThread);

 /************第二种方法*****************/
 //2、调用函数
    SuspendThread(hThread);

       /*2、如何使唤醒处于挂起的线程*///注释:挂起几次,唤醒几次
 /************方法*****************/
 //调用函数
  ResumeThread(hThread);

        /*3、如何使线程能够执行完毕*/
 /************第一种方法*****************/
 /*DWORD exitCode=0;
 //轮询线程是否退出
 do
 {
  GetExitCodeThread(hThread,&exitCode); 这个函数不会阻塞,因而处于忙等待,我们应当尽可能避免。

 } while (exitCode==STILL_ACTIVE);
 cout<<exitCode<<endl;
 */
 /************第二种方法*****************/
 DWORD ret;
 ret=WaitForSingleObject(hThread,INFINITE);
 if (ret==WAIT_OBJECT_0)
 {
  cout<<"wait success"<<endl;
 }
 else if (ret==WAIT_FAILED)
 {
  cout<<"error with code"<<GetLastError()<<endl;
  exit(1);
 }
 CloseHandle(hThread);
 return 0;
}

/*******请看代码实例二:_beginthreadex的实现*************/

#include <iostream>
#include<windows.h>
#include<process.h>
using namespace std;
unsigned __stdcall ThreadProc(void* lpParameter)
{
 cout<<"GetCurrentThreadId()="<<GetCurrentThreadId()<<endl;
 int n=(int)lpParameter;
 while (n--)
 {
  cout<<"this is a test"<<endl;
  Sleep(1000);
 }
 return 1000;
}
int main()
{
 unsigned threadId;
 HANDLE hThread=(HANDLE)_beginthreadex(NULL,0,ThreadProc,(void*)5,0,&threadId);
 //HANDLE hThread=CreateThread(NULL,0,ThreadProc,(LPVOID)5,/*CREATE_SUSPENDED*/0,&dwThreadId);
 cout<<"dwThreadId="<<threadId<<endl;
 if (threadId==NULL)
 {
  cout<<"error with code"<<GetLastError()<<endl;
  exit(1);
 } 
     /*1、如何使线程处于挂起状态*/
 /************第一种方法*****************/
 //1、设置参数CREATE_SUSPENDED
 //CreateThread(NULL,0,ThreadProc,(LPVOID)5,CREATE_SUSPENDED,&dwThread);
 /************第二种方法*****************/
 //2、调用函数
    SuspendThread(hThread);
       /*2、如何使唤醒处于挂起的线程*///注释:挂起几次,唤醒几次
 /************方法*****************/
 //调用函数
  ResumeThread(hThread);
        /*3、如何使线程能够执行完毕*/
 /************第一种方法*****************/
 /*DWORD exitCode=0;
 //轮询线程是否退出
 do
 {
GetExitCodeThread(hThread,&exitCode); 这个函数不会阻塞,因而处于忙等待,我们应当尽可能避免。
 } while (exitCode==STILL_ACTIVE);
 cout<<exitCode<<endl;
 */
 /************第二种方法*****************/
 DWORD ret;
 ret=WaitForSingleObject(hThread,INFINITE);
 if (ret==WAIT_OBJECT_0)
 {
  cout<<"wait success"<<endl;
 }
 else if (ret==WAIT_FAILED)
 {
  cout<<"error with code"<<GetLastError()<<endl;
  exit(1);
 }
 CloseHandle(hThread);
 system("pause");
 return 0;
}

详细讲解如下:

实现方式:

1、使用API线程接口函数:
CreateThread()
ExitThread()
CloseHandle()


2、使用多线程c runtime library(C运行环境库):
_beginthreadex()
_endthreadex()


相关函数总结:

1、CreateThread

包含头文件windows.h
函数原型
HANDLE WINAPI CreateThread(
    LPSECURITY_ATTRIBUTES lpThreadAttributes,
    SIZE_T dwStackSize,
    LPTHREAD_START_ROUTINE lpStartAddress,
    LPVOID lpParameter,
    DWORD dwCreationFlags,
    LPDWORD lpThreadId
);
函数返回值:句柄,返回NULL代表线程创建失败
函数参数:
lpThreadAttributes:安全属性指针,NULL表示使用缺省值
dwStackSize:初始堆栈大小,0代表使用默认大小:1MB
lpStartAddress:线程函数,是一个函数指针,可以传一个函数名
lpParameter:线程函数的参数
dwCreationFlags:创建选项,默认为立即执行
lpThreadId:输出参数,表示线程标识符,新线程的ID


2、GetExitCodeThread

获得指定线程的终止状态
函数原型:
BOOL WINAPI GetExitCodeThread(
    HANDLE hThread,
    LPDWORD lpExitCode
);
函数参数:
hThread:由CreateThread()传回的线程句柄
lpExitCode:输出参数,用来接收结束代码
返回值:成功返回TRUE(非0),失败返回FALSE(0)
说明:如果线程尚未终止,lpExitCode的值为STILL_ACTIVE

3、WaitForSingleObject

等待核心对象处于激发状态或者超时
函数原型:
DWORD WINAPI WaitForSingleObject(
    HANDLE hHandle,
    DWORD dwMilliseconds
);
返回值:
WAIT_ABANDONED(0x00000080L)
WAIT_OBJECT_0(0x00000000L)
WAIT_TIMEOUT(0x00000102L)
WAIT_FAILED (0xFFFFFFFF)

4、SuspendThread


于挂起指定的线程,如果函数执行成功,则线程的执行被终止。
函数原型:
 DWORD SuspendThread(HANDLE hThread);
函数参数:
hThread:指向要挂起线程的句柄
返回值:
成功返回大于零的数,表示线程之前挂起的计数。失败返回-1,可以使用GetLastError()获得错误信息。
说明:
创建新的线程后,该线程就开始启动执行。但如果在dwCreationFlags中使用了CREATE_SUSPENDED特性,线程并不马上执行,而是先挂起,等到调用ResumeThread后才开始启动线程。

5、ResumeThread

线程挂起计数减1,当挂起计数为0时,结束线程的挂起状态,执行线程。
函数原型:
 DWORD ResumeThread(HANDLE hThread);
函数参数:
hThread:指向要被回复的线程的句柄
返回值:请参考Suspend()函数

6、CloseHandle

数原型:
 BOOL CloseHandle(
     HANDLE hObject   // handle to object);
功能:将内核对象引用计数减1


7、线程终止

    自杀方式:
              线程函数返回(return),线程自动终止
              ExitThread或_endthreadex


    他杀方式:
             TerminateThread

8、ExitThread


在线程内部结束一个线程
函数原型:
 VOID ExitThread(DWORD dwExitCode);
函数参数:
dwExitCode:指定此线程的退出代码
返回值:无

9、TerminateThread

在线程外部强制结束一个线程
函数原型:
BOOL TerminateThread(HANDLE hThread,
     DWORD dwExitCode);
函数参数:
hThread:指定需要结束的线程句柄
dwExitCode:指定此线程的退出代码
返回值:成功返回TRUE(非0),失败返回FALSE(0)


10、_beginthreadex

  包含头文件process.h
函数原型
unsigned long _beginthreadex(
 void *security,
 unsigned stack_size,
 unsigned ( __stdcall *start_address )( void * ),
 void *arglist,
 unsigned initflag,
 unsigned *thrdaddr
);

注释:CreateThread与_beginthreadex使用比较:

      下面是一些一般性的规则。

1、如果主线程以外的任何线程进行以下操作,你就应该使用多线程版的 C runtime library ,并使用_beginthreadex()  和 _endthreadex(): 
(1)在C 程序中使用 malloc()  和 free() ,或是在 C++  程序中使用 new  和 delete 。
(2)调用 stdio.h  或 io.h  中声明的任何函数,包括像 fopen() 、open() 、getchar() 、write() 、printf() 等等。所有这些函数都用到共享的数据结构以及errno。你可以使用 wsprintf()  将字符串格式化,如此就不需要 stdio.h  了。如果链接器抱怨说它找不到 wsprintf() ,你得链接 USER32.LIB 。

(3)使用浮点变量或浮点运算函数。 
(4)调用任何一个使用了静态缓冲区的 runtime 函数,如asctime() 、strtok() 或 rand() 。


2、一个程序如果使用多个线程,而不在任何 worker 线程中调用runtim e  library ,能够与单线程版的 runtime  library  链接并以 CreateThread() 取代 _beginthreadex() 。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值