C++的CreateThread实例

function CreateThread(

lpThreadAttributes: Pointer; {安全设置}

dwStackSize: DWORD; {堆栈大小}

lpStartAddress: TFNThreadStartRoutine; {入口函数}

lpParameter: Pointer; {函数参数}

dwCreationFlags: DWORD; {启动选项}

var lpThreadId: DWORD {输出线程 ID }

): THandle; stdcall; {返回线程句柄}



1、返回值:返回线程句柄

"句柄" 类似指针, 但通过指针可读写对象, 通过句柄只是使用对象;

有句柄的对象一般都是系统级别的对象(或叫内核对象); 之所以给我们的是句柄而不是指针, 目的只有一个: "安全";

貌似通过句柄能做很多事情, 但一般把句柄提交到某个函数(一般是系统函数)后, 我们也就到此为止很难了解更多了; 事实上是系统并不相信我们.



不管是指针还是句柄, 都不过是内存中的一小块数据(一般用结构描述), 微软并没有公开句柄的结构细节, 猜一下它应该包括: 真实的指针地址、访问权限设置、引用计数等等.



既然 CreateThread 可以返回一个句柄, 说明线程属于 "内核对象".

实际上不管线程属于哪个进程, 它们在系统的怀抱中是平等的; 在优先级(后面详谈)相同的情况下, 系统会在相同的时间间隔内来运行一下每个线程, 不过这个间隔很小很小, 以至于让我们误以为程序是在不间断地运行.

//ThreadBase.h<br>#pragma once
#include<windows.h>
class CThreadBase
{
public:
    CThreadBase(void);
    ~CThreadBase(void);
    static DWORD WINAPI ThreadProc (PVOID pParam);
    virtual void Run() = 0;
    void Start();

private:
    HANDLE m_hThread;
    DWORD  m_dwThreadID;
};
//ThreadBase.cpp

#include "StdAfx.h"
#include "ThreadBase.h"

CThreadBase::CThreadBase(void)
{
    m_hThread = CreateThread(NULL,0,ThreadProc,this,CREATE_SUSPENDED,&m_dwThreadID);
}

CThreadBase::~CThreadBase(void)
{
    CloseHandle(m_hThread);
}
DWORD WINAPI CThreadBase::ThreadProc (PVOID pParam)
{

    if (NULL!=pParam)
    {
        ((CThreadBase*)pParam)->Run();
    }
    return 0;
}
void CThreadBase::Start()
{
    ResumeThread(m_hThread);
}

参考文献:

采用CreateThread()创建多线程程序

CreateThread用法详解

原文链接: https://www.cnblogs.com/rainbow70626/p/5589396.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/235229

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 下午4:34
下一篇 2023年2月13日 下午4:34

相关推荐