线程的创建以及使用(MFC/C/C++)

目录

一、创建线程的几种方法

1、使用POSIX线程库(pthread)(C)

2、 使用Windows线程库(Win32 API)(C)

3、使用C++11标准库

二、线程的应用(常用实例,附上完整代码)

1、CreateThread创建线程的实例


一、创建线程的几种方法

在C/C++中,有多种方法可以创建线程,以下列出了其中几种常用的方法:

1、使用POSIX线程库(pthread)(C)

        POSIX线程库是一套用于多线程编程的标准库,在大部分类UNIX系统上都可以使用。可以使用pthread_create()函数来创建线程。

// C
#include <pthread.h>void *threadFunc(void *arg) {// 线程的代码逻辑return NULL;
}int main() {pthread_t tid;pthread_create(&tid, NULL, threadFunc, NULL);// 主线程的代码逻辑pthread_join(tid, NULL); // 等待子线程执行完毕return 0;
}

2、 使用Windows线程库(Win32 API)(C)

        在Windows操作系统上,可以使用Win32 API来创建线程。可以使用CreateThread()函数来创建线程。

(1)CreateThread()的原型为:

HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES   lpThreadAttributes,
  SIZE_T                  dwStackSize,
  LPTHREAD_START_ROUTINE  lpStartAddress,
  LPVOID                  lpParameter,
  DWORD                   dwCreationFlags,
  LPDWORD                 lpThreadId
);

参数说明:

  • lpThreadAttributes:线程的安全属性,默认为NULL。
  • dwStackSize:线程堆栈的大小,默认为0,表示使用默认的堆栈大小。
  • lpStartAddress:线程的入口函数地址,可以是一个函数指针或者线程函数的名字。
  • lpParameter:传递给线程函数的参数。
  • dwCreationFlags:线程的创建标志,可以设置一些额外的选项,如CREATE_SUSPENDED(创建后暂停)等。
  • lpThreadId:用于接收线程ID的指针。

CreateThread函数创建一个新的线程,并返回一个指向线程的句柄。通过这个句柄,可以对线程进行一些操作,如等待线程结束、挂起或恢复线程等。

(2)下面是一个简单的示例,演示如何使用CreateThread创建一个新的线程:

// c
#include <windows.h>DWORD WINAPI threadFunc(LPVOID lpParam) {// 线程的代码逻辑return 0;
}int main() {HANDLE hThread = CreateThread(NULL, 0, threadFunc, NULL, 0, NULL);// 主线程的代码逻辑WaitForSingleObject(hThread, INFINITE); // 等待子线程执行完毕CloseHandle(hThread);return 0;
}

3、使用C++11标准库

        在C++11标准中,引入了std::thread类,可以方便地创建和管理线程。

// c++
#include <thread>void threadFunc() {// 线程的代码逻辑
}int main() {std::thread t(threadFunc); // 创建线程// 主线程的代码逻辑t.join(); // 等待子线程执行完毕return 0;
}

4、AfxBeginThread (MFC)

        AfxBeginThread 是一个 MFC(Microsoft Foundation Class)函数,用于创建一个新的线程。它的含义是在应用程序中启动一个新的线程,以便在后台执行一些任务,而不会阻塞主线程的运行。

AfxBeginThread 函数的原型如下:
CWinThread* AfxBeginThread(
AFX_THREADPROC pfnThreadProc,
LPVOID pParam,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);

参数说明:

  • pfnThreadProc:指向线程函数的指针,该线程函数将在新线程中执行。
  • pParam:传递给线程函数的参数。
  • nPriority:新线程的优先级,默认为 THREAD_PRIORITY_NORMAL。
  • nStackSize:新线程的堆栈大小,默认为 0,表示使用默认堆栈大小。
  • dwCreateFlags:创建线程的标志,默认为 0。
  • lpSecurityAttrs:线程安全属性,默认为 NULL。

AfxBeginThread 函数将返回一个 CWinThread 对象的指针,可以使用该指针来管理和控制新线程的行为,如等待线程结束、获取线程ID等。

总之,AfxBeginThread 函数用于创建一个新的线程,并在新线程中执行指定的函数,以实现多线程编程。

实例:

// 声明一个变量,继承于CWinThread
UINT ReceiveMsgThreadID;
CThreadReceiveRespMsg *pThreadReceiveMsg;//启动线程	
pThreadReceiveMsg = (CThreadReceiveRespMsg *)::AfxBeginThread(RUNTIME_CLASS(CThreadReceiveRespMsg), THREAD_PRIORITY_NORMAL);
if (pThreadReceiveMsg != NULL)
{log(_T("线程1启动成功 \n"));ReceiveMsgThreadID = pThreadReceiveMsg->m_nThreadID;
}
else
{log(_T("线程1启动失败 \n"));
}

以上是几种常用的创建线程的方法,选择哪种方法取决于你的需求和运行环境。

二、线程的应用(常用实例,附上完整代码)

1、CreateThread创建线程的实例

// 头文件
#pragma once
#include "singleton.h"
#include <windows.h>class CThreadBase
{
public:CThreadBase(void);virtual ~CThreadBase(void);public:// 开启线程void vStart();// 结束线程virtual void vStop();// 线程是否可运行virtual bool isCanRun();// 子类重写此函数用于接收线程逻辑virtual int circle();// 入锁、解锁临界区,不同的编译环境修改成其他的同步条件即可void _lock();void _unLock();protected:DWORD m_dThreadId;						// 线程ID	bool m_bCanRun;							// 是否可以运行int m_nThreadHandle;					// 线程句柄#ifdef WINVERCRITICAL_SECTION m_criSection;		// 临界区,定义一个,需要数据同步的自取即可
#endif
};
// 源文件
#include "ThreadBase.h"
//#include <afxwin.h>// 线程函数
DWORD WINAPI threadProc(LPVOID pArgs)
{if (0 == pArgs)return 0;CThreadBase* pThreadBase = (CThreadBase*)pArgs;pThreadBase->circle();return 0;
}CThreadBase::CThreadBase(void)
{m_bCanRun = false;m_dThreadId = 0;m_nThreadHandle = NULL;#ifdef WINVERInitializeCriticalSection(&m_criSection);
#endif
}CThreadBase::~CThreadBase(void)
{
}void CThreadBase::vStart()
{m_nThreadHandle = (int)CreateThread(NULL, 0, threadProc, this, 0, &m_dThreadId);m_bCanRun = true;
}void CThreadBase::vStop()
{m_bCanRun = false;
}bool CThreadBase::isCanRun()
{return m_bCanRun;
}int CThreadBase::circle()
{return TRUE;
}void CThreadBase::_lock()
{
#ifdef WINVEREnterCriticalSection(&m_criSection);
#endif
}void CThreadBase::_unLock()
{
#ifdef WINVERLeaveCriticalSection(&m_criSection);
#endif
}

使用时候:

(1)直接继承这个类,子类重写circle() 这个函数即可,这个函数用于接收线程的逻辑;

(2)想让线程执行的功能,可以写在子类的circle()中;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/5202.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何搭建一个标准的测量系统

要搭建一个标准的测量系统,需要考虑以下几个方面: 确定测量目的和需求:首先需要明确测量的目的和需求,例如测量长度、重量、体积等。同时需要考虑测量的精度和误差范围,以及测量系统的适用范围和条件等。选择合适的传感器:根据测量目的和需求,选择合适的传感器类型,例如…

数字化时代,如何做好用户体验与应用性能管理​

引言 随着数字化时代的到来&#xff0c;各个行业的应用系统从传统私有化部署逐渐转向公有云、行业云、微服务&#xff0c;这种变迁给运维部门和应用部门均带来了较大的挑战。基于当前企业 IT 运维均为多部门负责&#xff0c;且使用多种运维工具&#xff0c;因此&#xff0c;当…

Databend 开源周报第 102 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 为指定列创建 B…

极值理论 EVT、POT超阈值、GARCH 模型分析股票指数VaR、条件CVaR:多元化投资组合预测风险测度分析...

全文链接&#xff1a;http://tecdat.cn/?p24182 本文用 R 编程语言极值理论 (EVT) 以确定 10 只股票指数的风险价值&#xff08;和条件 VaR&#xff09;&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 使用 Anderson-Darling 检验对 10 只股票的组合数据进行…

【文生图系列】stable diffusion webui 汉化(双语)教程

文章目录 安装双语插件下载json源文件设置双语 这篇博文记录于我成功安装双语插件之后&#xff0c;所以以下的示例页面均是双语。汉化教程分为三步&#xff0c;安装插件&#xff0c;JSON源文件下载和最后一步的双语设置。 安装双语插件 在扩展&#xff08;extensions&#xf…

k8s如何访问 pod 元数据

如何访问 pod 元数据 **我们在 pod 中运行容器的时候&#xff0c;是否也会有想要获取当前 pod 的环境信息呢&#xff1f;**咱们写的 yaml 清单写的很简单&#xff0c;实际上部署之后&#xff0c; k8s 会给我们补充在 yaml 清单中没有写的字段&#xff0c;那么我们的 pod 环境信…

数学建模-典型相关分析

上节回顾 论文&#xff1a;常州大学一等奖淡水养殖… 要进行 pearson 相关系数 画散点图、折线图看是否相关检验正态分布满足上述&#xff0c;利用pearson相关系数 刚开始推导不会没关系&#xff0c;会应用就行&#xff0c;推导过程略&#xff0c;之后学习了后续知识&#xff…

❤️创意网页:HTML5,canvas创作科技感粒子特效(科技感粒子、js鼠标跟随、粒子连线)

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;简单好用又好看&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;欢迎踏入…

算法设计方法之回溯算法

回溯算法 介绍 回溯算法是算法设计中的一种方法。回溯算法是一种渐进式寻找并构建问题解决方式的策略。回溯算法会先从一个可能的动作开始解决问题&#xff0c;如果不行&#xff0c;就回溯并选择另一个动作&#xff0c;直到将问题解决。 就像你在一个迷宫里面遇到了当前有三…

Ubuntu 的安装及其设置

文章目录 安装 Ubuntu屏幕分辨率设置修改软件源服务器锁屏时间设置设置 dash跨系统拖拽复制文件的设置 安装 Ubuntu 首先安装 VMware 虚拟机&#xff0c;虚拟机的安装比较简单&#xff0c;一步步点击Next即可完成安装。 安装完成后启动虚拟机&#xff0c;点击创建新的虚拟机。…

AC+AP 旁挂式连接配置(华为)

AR1路由器配置 # interface GigabitEthernet0/0/0 ip address 10.1.30.1 255.255.255.0 ip route-static 10.1.20.0 255.255.255.0 10.1.30.2 # LSW1核心交换机 # dhcp enable vlan batch 10 20 30 interface Vlanif20 ip address 10.1.20.1 255.255.255.0 dhcp select in…

回归预测 | MATLAB实现基于ELM-Adaboost极限学习机结合AdaBoost多输入单输出回归预测

回归预测 | MATLAB实现基于ELM-Adaboost极限学习机结合AdaBoost多输入单输出回归预测 目录 回归预测 | MATLAB实现基于ELM-Adaboost极限学习机结合AdaBoost多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于ELM-Adaboost极限学…

模拟面试2

1.说一说ArrayList的实现原理&#xff1f; ArrayList底层基于数组实现&#xff0c;内部封装了Object类型的数组&#xff0c;实现了list接口&#xff0c;通过默认构造器创建容器时&#xff0c;该数组被初始化为一个空数组&#xff0c;首次添加数据时再将其初始化为容量为10的数组…

【个人笔记】linux的cd命令与目录结构理解

cd命令 cd&#xff08;英文全拼&#xff1a;change directory&#xff09;命令用于改变当前工作目录的命令&#xff0c;切换到指定的路径。 若目录名称省略&#xff0c;则变换至使用者的 home 目录 (也就是刚 login 时所在的目录)。 另外&#xff0c;~ 也表示为 home 目录 的…

【二分查找】LCP 18. 早餐组合

&#x1f4cd;前言 &#x1f57a;作者&#xff1a; 迷茫的启明星 学习路线C语言从0到1C初阶数据结构从0到1 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对…

菜鸟编程-python-函数,模块

目录 Python 函数 定义一个函数 语法 实例(Python 2.0+) Python 模块 support.py 模块: import 语

Java集合(List、Set、Map)

Java中的集合是用于存储和组织对象的数据结构。Java提供了许多不同的集合类&#xff0c;包括List、Set和Map等&#xff0c;以满足不同的需求。下面将介绍一些常见的Java集合类及其使用方法。 一、List List是一个有序的集合&#xff0c;它允许元素重复出现&#xff0c;并提供…

ArcGIS Pro工具一部分解释

序号 工具 功能介绍 1. 打包工程(PackageProject) 把工程所有内容打包一个文件 2. 合并工程(ConsolidateProject) 把工程和数据整理到同一个文件夹下 3. 要素转线(FeatureToLine) 把面要素转线要素或线要素打断 4. 定义投影(DefineProjection)

three.js学习记录(基础)

前言&#xff1a; 页面渲染3D特效&#xff0c;可以从各种图表库&#xff08;例如ECharts&#xff09;中寻找各种适用的模版&#xff0c;也可以寻找第三方插件。。。 一直以来都对three.js充满向往&#xff0c;终于偷闲找了个借口学了起来 参考资料 Three.js – JavaScript 3D…

什么?微信朋友圈能够一键转发了?

作为「国民级」聊天软件&#xff0c;微信朋友圈功能一直备受关注&#xff0c;毕竟社交 3 大巨头中&#xff0c;QQ 和微博都可以转发动态。那微信朋友圈能不能也像 QQ 空间这样&#xff0c;点击转发能分享到 QQ、微信和朋友圈呢&#xff1f; 那到底朋友圈转发怎么个转法&#xf…