欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Windows线程

程序员文章站 2022-07-05 12:39:08
...
线程组成
  • 线程内核对象:操作系统用他来管理线程,存放线程统计信息
  • 线程栈:用于维护线程执行时所需的所有函数参数和变量
线程退出方式
  • 线程退出最好的方式是通过线程函数返回
  • 线程通过ExitThread终止运行时,C/C++资源不会被销毁
  • 线程被TerminateThread杀死(此过程会以异步的方式进行),除非线程所属进程退出否则被杀死的线程的堆栈不会被释放。经测试,被杀死的线程的C++资源也不会被自动销毁(现象同被杀死的线程自己调用ExitThread一样)
  • 线程所属进程以ExitProcess或TerminateProcess方式被杀死,线程的清理工作也不能正常进行
#include <windows.h>
#include <cstdio>
#include <cassert>


class CTest
{
public:
    CTest() { printf("Create\n"); }
    ~CTest() { printf("Destroy\n"); }
};


DWORD WINAPI ThdFun(PVOID pValue)
{
    CTest Test;

    ExitThread(0);
    return 0;
}


int main()
{
    auto hThread = CreateThread(nullptr, 0, ThdFun, nullptr, 0, nullptr);
    assert(hThread);
    WaitForSingleObject(hThread, INFINITE);
    CloseHandle(hThread);
    
    system("pause");
    return 0;
}
/*
运行结果:输出"Create"而不会输出"Destroy"

备注:就算主进程退出也不会输出"Destroy"
*/
_beginthreadex
  • 标准C运行库设计的时间比线程出现的时间早了很多,所以标准C运行库设计的时候没有考虑线程安全性。为了保证C/C++多线程应用程序正常运行,创建线程的时候必须使用_beginthreadex而不是CreateThread
  • _beginthreadex产生的线程都有自己专用的_tiddata内存块,他们是从C/C++运行库的堆上分配的
  • _beginthreadex会在内部调用CreateThread
  • _beginthreadex失败返回0
  • 不要忘记使用CloseHandle来关闭_beginthreadex返回的句柄
  • _beginthreadex的参考文档:https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/beginthread-beginthreadex