Windows线程

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


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

你可能感兴趣的:(Windows线程)