c++使用_beginthreadex创建线程

 记录使用_beginthreadex(),来创建线程。方便后期的使用。

创建一个线程

相关函数介绍

unsigned long _beginthreadex(

  

    void *security,    // 安全属性, 为NULL时表示默认安全性

    unsigned stack_size,    // 线程的堆栈大小, 一般默认为0

    unsigned(_stdcall *start_address)(void *),    // 所要启动的线程函数

    void *argilist, // 线程函数的参数, 是一个void*类型, 传递多个参数时用结构体

    unsigned initflag,    // 新线程的初始状态,0表示立即执行,CREATE_SUSPENDED

表示创建之后挂起

    unsigned *threaddr    // 用来接收线程ID

);

返回值 : // 成功返回新线程句柄, 失败返回0

代码设计

根据以上的相关介绍来创建一个线程

bool Thread::start()
{
	unsigned int thd;
	tid = (HANDLE)_beginthreadex((void *)0, 0, (_beginthreadex_proc_type)Thread::execute, (void*)this, (unsigned)0, (unsigned*)&thd);
	return tid != NULL;
}

Thread::execute() 是要运行的线程函数

void Thread::run()
{
	int i = 1000;
	while (i>0)
	{
		std::cout << "run::%d..."<<i<<std::endl;
		i--;
	}
}

void Thread::execute(void*thread)
{
	((Thread*)thread)->run();
	CloseHandle((HANDLE)((Thread*)thread)->tid);
}

Thread::run(),此函数为要运行的逻辑代码 

等待一个线程

相关函数介绍

DWORD WaitForSignleObject( HANDLE hHandle, DWORD dwMilliseconds );
参数说明:
    hHandle表示要等待检查的对象句柄;
    dwMillseconds表示该函数等待的期限;


函数功能说明:

        该函数是用来等待指定的对象被触发或函数超时。若dwMilliseconds设置为无限大INFINITE则该函数一直等待下去直到对象被触发。


函数返回值:

WAIT_OBJECT_0表示函数成功执行且指定的对象被触发处于signaled有信号状态;
 WAIT_TIMEOUT表示函数成功执行但超时且对象没有被触发处于nonsignaled无信号状态;
  WAIT_FAILED表示函数执行失败,通常是由hHandle句柄不可用,可以调用GetLastError()查看。

代码设计

bool Thread::join()
{
	HANDLE ttid = (HANDLE)tid;
	if (ttid && WaitForSingleObject(ttid, INFINITE) == WAIT_OBJECT_0)
	{
		tid = 0;
		return true;
	}

	return false;
}

 代码的整体设计

线程类的声明

//Thread.h

#pragma once
class Thread
{
public:
	Thread();
	virtual ~Thread();
	bool start();
	bool join();
	virtual void run();
	static void execute(void*);
private:
	volatile void* tid;
};

线程类的实现

//Thread.cpp

#include"Thread.h"
#include <process.h>
#include<windows.h>
#include <iostream> 

Thread::Thread()
{

}

Thread::~Thread()
{

}

bool Thread::start()
{
	unsigned int thd;
	tid = (HANDLE)_beginthreadex((void *)0, 0, (_beginthreadex_proc_type)Thread::execute, (void*)this, (unsigned)0, (unsigned*)&thd);
	return tid != NULL;
}

bool Thread::join()
{
	HANDLE ttid = (HANDLE)tid;
	if (ttid && WaitForSingleObject(ttid, INFINITE) == WAIT_OBJECT_0)
	{
		tid = 0;
		return true;
	}

	return false;
}

void Thread::run()
{
	int i = 1000;
	while (i>0)
	{
		std::cout << "run::..."<<i<<std::endl;
		i--;
	}
}

void Thread::execute(void*thread)
{
	((Thread*)thread)->run();
	CloseHandle((HANDLE)((Thread*)thread)->tid);
}

测试

#include"Thread.h"

int main()
{
	Thread* PThread = new Thread();
	PThread->start();
	PThread->join();
	return 0;
}

测试结果

 此类,也可以做基类,通过继承重载run()操作,实现不同的操作

参考资料

C++ 使用_beginthreadex创建线程、线程句柄(等待线程关闭)、线程id的作用(发送线程消息)_c process.h 线程 等待线程结束-CSDN博客

相关推荐

  1. C++:创建线

    2024-06-08 15:48:02       32 阅读
  2. c# 多线创建线同步

    2024-06-08 15:48:02       38 阅读
  3. C++ 多线笔记1 线创建

    2024-06-08 15:48:02       30 阅读
  4. C# 创建线的函数

    2024-06-08 15:48:02       59 阅读
  5. C# 线使用

    2024-06-08 15:48:02       43 阅读
  6. (c/c++)——线的基础使用

    2024-06-08 15:48:02       38 阅读
  7. 如何创建线

    2024-06-08 15:48:02       49 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-08 15:48:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-08 15:48:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-08 15:48:02       87 阅读
  4. Python语言-面向对象

    2024-06-08 15:48:02       96 阅读

热门阅读

  1. Web前端与REST API:深度解析与实战指南

    2024-06-08 15:48:02       32 阅读
  2. 通过SSH远程登录华为设备

    2024-06-08 15:48:02       22 阅读
  3. Spring Boot 复习

    2024-06-08 15:48:02       26 阅读
  4. 【Rust】——【面向对象语言的特征】

    2024-06-08 15:48:02       32 阅读
  5. vscode找不到settings.json

    2024-06-08 15:48:02       28 阅读
  6. 【pnpm】安装依赖基础

    2024-06-08 15:48:02       32 阅读
  7. 求前缀表达式的值

    2024-06-08 15:48:02       28 阅读
  8. 深入理解 Vue 中的响应式系统

    2024-06-08 15:48:02       32 阅读
  9. Hudi Spark Sql Procedures 回滚 Hudi 表数据

    2024-06-08 15:48:02       32 阅读
  10. webrtc客户端测试和arm平台测试(待补充)

    2024-06-08 15:48:02       29 阅读
  11. 用r语言处理 Excel数据当中的缺失值方法

    2024-06-08 15:48:02       33 阅读