当前位置: 首页 > backend >正文

多线程编程(二)

Win32多线程程序设计

使用API线程接口函数:

  • CreateThread()
  • ExitThread()
  • CloseHandle()
使用多线程c runtime library(C运行环境库):
  • _beginthreadex()
  • _endthreadex()

CreateThread

包含头文件windows.h

函数原型

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

获得指定线程的终止状态
函数原型:
BOOL WINAPI GetExitCodeThread(
    HANDLE hThread,
    LPDWORD lpExitCode
);
函数参数:

  • hThread:由CreateThread()传回的线程句柄
  • lpExitCode:输出参数,用来接收结束代码
返回值:成功返回TRUE(非0),失败返回FALSE(0)
说明:如果线程尚未终止,lpExitCode的值为STILL_ACTIVE。

WaitForSingleObject

等待核心对象处于激发状态(线程完毕)或者超时
函数原型:
DWORD WINAPI WaitForSingleObject(
    HANDLE hHandle,
    DWORD dwMilliseconds
);
返回值:

  • WAIT_ABANDONED(0x00000080L)
  • WAIT_OBJECT_0(0x00000000L)
  • WAIT_TIMEOUT(0x00000102L)
  • WAIT_FAILED (0xFFFFFFFF)

SuspendThread

用于挂起指定的线程,如果函数执行成功,则线程的执行被终止。
函数原型:
DWORD SuspendThread(HANDLE hThread);
函数参数:
hThread:指向要挂起线程的句柄
返回值:
成功返回大于零的数,表示线程之前挂起的计数。失败返回-1,可以使用GetLastError()获得错误信息。
说明:

创建新的线程后,该线程就开始启动执行。但如果在dwCreationFlags中使用了CREATE_SUSPENDED特性,线程并不马上执行,而是先挂起,等到调用ResumeThread后才开始启动线程。


ResumeThread

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

返回值:请参考Suspend()函数


CloseHandle

函数原型:
BOOL CloseHandle(
    HANDLE hObject   // handle to object);

功能:将内核对象引用计数减1


usage count初始为2 ,线程完成后减1.suspend count 默认值为0,线程退出时受信为ture;

线程终止

自杀

  • 线程函数返回(return),线程自动终止
  • ExitThread或_endthreadex
他杀
  • TerminateThread

ExitThread

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

返回值:无

TerminateThread

在线程外部强制结束一个线程
函数原型:
BOOL TerminateThread(HANDLE hThread, DWORD dwExitCode);
函数参数:
hThread:指定需要结束的线程句柄
dwExitCode:指定此线程的退出代码

返回值:成功返回TRUE(非0),失败返回FALSE(0)

下面是一个简单的多线程程序

#include<Windows.h>
#include<iostream>using namespace std;DWORD WINAPI ThreadProc(LPVOID lpParameter)
{cout << "GetCurrentThread()=" << GetCurrentThread() << endl;int n = (int)lpParameter;while (n--){cout << "this is a test" << endl;Sleep(1000);}return 100;}
int main()
{DWORD dwThreadId;//创建线程HANDLE hThread=CreateThread(NULL, 0, ThreadProc, (LPVOID)5, 0, &dwThreadId);if (hThread == NULL){cout << "error whit code" << GetLastError() << endl;exit(1);}SuspendThread(hThread);//线程挂起 计数加1ResumeThread(hThread); //计数减1//轮询线程是否退出//DWORD exitCode = 0;//do//{//	GetExitCodeThread(hThread, &exitCode);//} while (exitCode == STILL_ACTIVE);    //这个函数不会阻塞,因为处于忙等待,我们应该尽可能避免//cout << "exitCode" << exitCode << endl;DWORD ret;ret=WaitForSingleObject(hThread, INFINITE);  //阻塞if (ret == WAIT_FAILED){cout << "error whit code" << GetLastError() << endl;exit(1);}else if (ret == WAIT_OBJECT_0){cout << "wait succ" << endl;}CloseHandle(hThread);return 0;}



http://www.xdnf.cn/news/11209.html

相关文章:

  • 计算机丢失shlwapi,请教高手提示shlwapi.dll错误应该怎么处理?
  • 【学习求职必备】认真认识一下世界末日那年成立的“华为诺亚方舟实验室”...
  • 批处理删除指定文件或文件夹
  • 10款浏览器兼容性测试工具,让你的测试效率瞬间飙升!
  • css的全教程
  • 找不到d3dx9_43.dll无法继续执行代码的几种解决方法
  • 单元测试报NullPointerException
  • C++string类使用大全
  • 基于51单片机的恒温控制系统设计
  • session.setAttribute和session.getAttribute
  • L7805CV-ASEMI三端稳压管L7805CV
  • 多图详细教你注册Google(Gmail)新账号,常见问题和注意事项
  • 以ATTCK为例构建网络安全知识图
  • 网络安全(黑客)2024小白自学必看
  • Matlab学习——求解微分方程(组)
  • 【实用党】推荐几款实用的AI工具
  • Android游戏开发之旅View类详解自定义View的常用方法:onFinishInflate
  • JDK6 新特性
  • micro SD(TF)卡详解
  • pure virtual function call--虚函数调用的错误
  • MPP文件怎么打开?五种方法总有最合适!
  • 搭建免费的ftp服务器
  • 别人总结的英语网站大全
  • uploadify 火狐 php,ThinkPHP 解决使用uploadify 在Firefox浏览器上传图片出现HTTP 500报错...
  • C++使用CriticalSection前需要先初始化
  • ResultSetMetaData用法介绍
  • mysql2005中文版_SQL Server 2005 sp4 简体中文完整免费版下载
  • 去AV片马赛克,开发者被抓了
  • 轻论坛StartBBS、YouBBS、Xiuno对比
  • C++表达式括号匹配