CreateThread和_beginthread的区别
来源:互联网 发布:微商做图片的软件 编辑:程序博客网 时间:2024/06/11 12:23
进程的三个基本状态
1 HANDLE WINAPI CreateThread(2 __in LPSECURITY_ATTRIBUTES lpThreadAttributes,3 __in SIZE_T dwStackSize,4 __in LPTHREAD_START_ROUTINE lpStartAddress,5 __in LPVOID lpParameter,6 __in DWORD dwCreationFlags,7 __out LPDWORD lpThreadId8 );
1 uintptr_t _beginthreadex( 2 void *security,3 unsigned stack_size,4 unsigned ( *start_address )( void * ),5 void *arglist,6 unsigned initflag,7 unsigned *thrdaddr 8 );
两个函数都是用于创建线程,第一个是Windows API函数,在WinBase.h头文件中,第二个不是API函数,在process.h头文件中
参数说明:
1.线程安全性:表示是否可以被子进程所继承
2.初始堆栈大小:如果为0或者小于默认值,则使用和调用线程同样大小的空间
3.线程其实地址:一个函数指针,指向线程函数
4.参数:传递给线程函数的参数
5.创建选项:如果为CREATE_SUSPENDED表示创建后挂起,如果为0表示创建后立即执行
6.线程ID
两个函数的区别:
malloc、fopen、ctime等函数需要专门的线程局部存储数据块,这个数据块在创建线程时创建。如果用CreateThread,则不会创建,这样,函数能够正常使用,但是会自动创建数据块,但是函数并不会释放创建的数据库,所以并不会将其删除,就导致内存泄露!!!
而_beginthreadex(内部也调用CreateThread)和_beginthreadex(会自动调用CloseHandle关闭句柄)对这个内存块做了处理。
代码演示:
1 #include <iostream> 2 #include <Windows.h> 3 #include <process.h> 4 using namespace std; 5 6 7 DWORD WINAPI CreateFun(LPVOID lParam) 8 { 9 cout << "CreateThread" << endl;10 return 0;//0表示成功11 12 }13 14 UINT _stdcall beginFun(LPVOID lParam)15 {16 cout << "beginthreadex" << endl;17 return 0;18 }19 int main(void)20 {21 22 DWORD dwID;23 UINT nID;24 HANDLE hC;25 HANDLE hB;26 27 hC = CreateThread(NULL, 0, CreateFun, NULL, 0, &dwID);28 29 if (NULL != hC)30 {31 CloseHandle(hC);32 }33 34 35 36 hB = (HANDLE)_beginthreadex(NULL, 0, beginFun, NULL, 0, &nID);37 if (NULL != hB)38 {39 CloseHandle(hB);40 }41 42 Sleep(1000);43 }
CloseHandle:关闭句柄
调用CloseHandle并不会终止线程的执行,而是递减线程内核对象句柄计数,线程执行完毕后也会自动递减,当计数为0时释放线程内核对象。当进程终止时也会清理内核对象。
但是,如果不关闭,可能导致有些进程拥有的资源无法释放,导致内存泄露。
线程的相关函数:
(1)CreateThread:创建线程,失败返回NULL,成功返回线程句柄
(2)SuspendThread:挂起线程
(3)ResumeThread:恢复线程
(4)OpenThread:打开线程,根据线程ID得到线程句柄
(5)ExitThread:退出线程
(6)TerminateThread:终止线程
(7)GetExitCodeThread:获取线程运行状态,如果为STILL_ALIVE表示正在运行。
(8)GetCurrentThread:获取当前线程句柄
(9)GetCurentThreadID:获取当前线程ID
注意:最好不要显式的调用ExitThread和TerminateThread,因为可能导致线程无法清理某些东西,导致内存泄露~
- CreateThread和_beginthread的区别
- CreateThread和_beginthread的区别
- CreateThread和_beginthread的区别
- CreateThread和_beginthread的区别
- _beginthread 和 CreateThread 区别
- _beginthread 和 CreateThread 区别
- CreateThread 、Afxbeginthread 和 _beginThread 的区别
- CreateThread和_beginthread的区别及使用
- 关于_beginthreadex、_beginthread和CreateThread的区别
- CreateThread、_beginthread和_beginthreadex区别
- CreateThread,_beginthread,_beginthreadx的区别
- CreateThread与_beginthread的区别
- CreateThread与_beginthread的区别
- CreateThread与_beginthread的区别
- CreateThread,_beginthread,_beginthreadx的区别
- CreateThread,_beginthread,_beginthreadx的区别
- CreateThread与_beginthread的区别
- CreateThread,_beginthread,_beginthreadx的区别
- Windows API —— ShellExcute——打开文件
- 环境变量
- 汽车撞到一位女孩之后的N种版本
- CXF 拦截器预处理request、response消息
- EXE文件格式判断
- CreateThread和_beginthread的区别
- ASP.NET验证码
- C#操作EXCEL
- public.xml的作用!
- Tri_integral Winter Training 0 比赛总结
- Javascript技巧
- IT类网址导航
- MFC下调用控制台和控制台下MFC库的支持
- MFC窗口和控件大小等比例变化