【多线程简单实例】CreateThread实现
来源:互联网 发布:怎么自己做软件 编辑:程序博客网 时间:2024/05/11 16:10
使用Windows的多线程函数,必须在程序中包含<Windows.h>
线程的创建和终止
C++代码:
/***********************************************//** NAME:多线程测试 //** USER:LZ//** TIME:2017-10-19/***********************************************/#include<iostream>#include<windows.h>using namespace std;DWORD WINAPI PROCESST1(LPVOID param); DWORD WINAPI PROCESST2(LPVOID param);DWORD WINAPI PROCESST3(LPVOID param);int main(){ HANDLE Thread1,Thread2,Thread3; Thread1=CreateThread(NULL,0,PROCESST1,NULL,0,NULL); Thread2=CreateThread(NULL,0,PROCESST2,NULL,0,NULL); Thread3=CreateThread(NULL,0,PROCESST3,NULL,0,NULL); WaitForSingleObject(Thread1,INFINITE); WaitForSingleObject(Thread2,INFINITE); WaitForSingleObject(Thread3,INFINITE); CloseHandle(Thread1); CloseHandle(Thread2); CloseHandle(Thread3); return 0;}DWORD WINAPI PROCESST1(LPVOID param){ while(true) { cout<<"THE Thread1 IS working."<<endl; Sleep(500); } return 0;}DWORD WINAPI PROCESST2(LPVOID param){ while(true) { cout<<"THE Thread2 IS working.."<<endl; Sleep(500); } return 0;}DWORD WINAPI PROCESST3(LPVOID param){ while(true) { cout<<"THE Thread3 IS working..."<<endl; Sleep(500); } return 0;}
函数详解
- CreateThread()是一种微软在Windows API中提供了建立新的线程的函数,该函数在主线程的基础上创建一个新线程。如果成功,函数则向线程返回一个句柄。如果失败,则返回NULL。线程中止运行后,线程对象仍然在系统中,必须通过CloseHandle函数来关闭该线程对象,否则,会在父进程结束时自动销毁它。
- CreateThread()会导致内存泄漏,在其创建的线程中使用sprintf,malloc等涉及CRT存储堆操作的CRT库函数是不安全的。建议使用改进了的_beginthread()和_beginthreadx()。
CreateThread()函数原型:
HANDLE CreateThread(LPSECURITY_ATTRIBUTES secAttr,SIZE_T stackSize,LPTHREAD_START_ROUTINE threadFunc,LPVOID param,DWORD flags,LPDWORD threadID);
函数说明:
1. 第一个参数secAttr是描述线程内核对象安全属性的指针,设置为NULL,就会使用默认的安全描述符。
2. 第二个参数stackSize表示线程栈空间大小。如果为0(1MB),那么这个线程堆栈的大小与创建它的线程相同。
3. 第三个参数threadFunc表示新线程所执行的线程函数地址,多个线程可以使用同一个函数地址,线程的执行一直持续到线程函数返回。
这个函数的地址在下面的函数中指定。每个线程函数都必须具有这样的原型:
DWORD WINAPI Thread1(LPVOID param);
-DWORD是数据类型,WINAPI是函数调用形式,返回32位数据的API函数。
- 需要传递给新线程的任何参数都在CreateThread()的param中指定。线程函数在它的参数中接收这个32位的值。这个参数可以用作任何目的。函数返回它的退出状态。
- WINAPI是一个宏,所代表的符号是__stdcall。windows API函数采用这种标准调用约定。
#define WINAPI __stdcall
stdcall的调用约定意味着:
1)参数从右向左压入堆栈;
2)函数自身修改堆栈;
3)函数名自动加前导的下划线,后面紧跟一个@符号,其后紧跟着参数的尺寸。
4.第四个参数param是传给线程函数的参数。
5.第五个参数flags标志了线程的执行状态,为0表示线程创建之后立即就可以进行调度,如果为CREATE_SUSPENDED,线程则以挂起状态创建并等待执行,这样它就无法调度,直到调用ResumeThread()。
6.第六个参数threadid将以的长整型返回线程的ID号,传入NULL表示不需要返回该线程ID号。
- Handle句柄类。可以理解为采用了引用计数的代理类,其多个句柄共享了同一个被代理的类.通过引用计数的方式来减少复制以及内存管理,其行为类似指针。
- CloseThread()函数并不是把线程结束了,而是把线程句柄结束了. 线程执行完就会return,就当做一个函数执行完一样退出.在这里close的意思是, 主进程放弃对线程的控制了.
函数原型: BOOL CloseHandle( HANDLE hObject );
hObject 代表一个已打开的对象handle。如果成功,函数返回TRUE,失败返回FALSE,此时可以调用GetLastError()获知失败原因。
- WaitForSingleObject()等待函数可使线程自愿进入等待状态,直到一个特定的内核对象变为已通知状态为止。即在dwMilliseconds时间结束之前,调用的线程不应该变为可调度状态。
函数原型:DWORD WaitForSingleObject(HANDLE hObject,DWORD dwMilliseconds);
第一个参数hObject标识一个能够支持被通知/未通知的内核对象。
第二个参数dwMilliseconds为该线程为等待该对象变为已通知状态的等待时间。(INFINITE为无限时间量。INFINITE也可定义为0xFFFFFFFF或-1)
- 【多线程简单实例】CreateThread实现
- C++多线程实例(CreateThread)
- CreateThread简单那多线程编程
- CreateThread简单那多线程编程
- 【多线程简单实例】_beginthreadx实现
- CreateThread创建一个简单的多线程
- 多线程CreateThread
- c++中实现多线程的简单实例
- 一个基于C++的多线程编程实例(CreateThread函数)
- 多线程操作简单实例
- 简单多线程实例
- C++多线程简单实例
- C#多线程简单实例
- 简单的多线程实例
- WPF多线程简单实例
- 多线程简单实例
- window多线程简单实例
- 简单多线程通信实例
- 简单表格删除
- java-io流
- 深入理解Java中的String
- unity使用share_SDK接微信分享和登陆的总结Android
- 持久化存储解决方案MagicalRecord使用入门
- 【多线程简单实例】CreateThread实现
- redis 老版本
- C#中枚举值对应的值相同时的情况
- 洛谷P1902 刺杀大使(二分答案+bfs验证)
- git命令之clone
- java long转换为int 类型 注意事项
- vs2013 SQL server添加约束的语法
- 学习数组与指针
- 朴素贝叶斯