std::thread简单使用

2023-09-22 11:55:22

std::thread 是 C++ 标准库中用于多线程编程的类。它允许你创建和管理线程,使程序能够并发执行不同的任务。以下是关于 std::thread 的详细介绍以及几个示例说明:

创建线程

你可以使用 std::thread 构造函数创建新的线程,并将要执行的函数传递给它。以下是创建线程的基本示例:

#include <iostream>
#include <thread>

void threadFunction() {
    // 这个函数将在新线程中执行
    std::cout << "Hello from thread!" << std::endl;
}

int main() {
    // 创建新线程并启动
    std::thread t(threadFunction);

    // 主线程继续执行自己的任务

    // 等待新线程结束
    t.join();

    return 0;
}

在上述示例中,我们创建了一个名为 t 的新线程,并将 threadFunction 函数传递给它。主线程继续执行自己的任务,然后使用 t.join() 等待新线程的结束。

传递参数给线程函数

你可以通过将参数传递给线程函数来向线程传递数据。以下是一个带有参数的示例:

#include <iostream>
#include <thread>

void threadFunction(int x, const std::string& str) {
    std::cout << "Received: " << x << " and " << str << std::endl;
}

int main() {
    int data = 42;
    std::string message = "Hello from main thread";

    // 创建新线程并传递参数
    std::thread t(threadFunction, data, message);

    // 等待新线程结束
    t.join();

    return 0;
}

后台线程

有时,你可能希望创建一个后台线程,它会在程序退出时自动终止,而不需要显式调用 join()。你可以使用 std::thread::detach() 将线程设置为后台线程:

#include <iostream>
#include <thread>

void threadFunction() {
    // 后台线程执行的任务
    std::cout << "Background thread is running." << std::endl;
}

int main() {
    // 创建后台线程
    std::thread t(threadFunction);

    // 分离线程,使其成为后台线程
    t.detach();

    // 主线程继续执行自己的任务

    // 注意:不要在后台线程结束前退出程序,否则可能导致线程终止的不确定行为

    return 0;
}

线程同步

在多线程编程中,需要谨慎处理共享资源,以避免竞态条件和数据访问冲突。C++ 提供了一些线程同步工具,如 std::mutex 和 std::lock_guard,来帮助你确保线程安全。以下是一个使用 std::mutex 的示例,保护共享数据的访问:

#include <iostream>
#include <thread>
#include <mutex>

std::mutex mtx;  // 用于保护共享资源的互斥锁
int sharedData = 0;

void threadFunction() {
    // 加锁互斥锁,以确保线程安全访问共享数据
    std::lock_guard<std::mutex> lock(mtx);
    sharedData++;
}

int main() {
    std::thread t1(threadFunction);
    std::thread t2(threadFunction);

    t1.join();
    t2.join();

    // 输出共享数据的值
    std::cout << "Shared data: " << sharedData << std::endl;

    return 0;
}

在这个示例中,我们使用 std::mutex 来保护 sharedData 的访问,以确保两个线程不会同时修改它。

这些示例只是 std::thread 的一些基本用法。在实际应用中,多线程编程可能更复杂,需要更多的同步和线程管理。因此,确保深入学习 C++ 多线程编程并遵循最佳实践,以避免潜在的问题。

更多推荐

淘天集团联合爱橙科技开源大模型训练框架Megatron-LLaMA

9月12日,淘天集团联合爱橙科技正式对外开源大模型训练框架——Megatron-LLaMA,旨在让技术开发者们能够更方便地提升大语言模型训练性能,降低训练成本,并保持和LLaMA社区的兼容性。测试显示,在32卡训练上,相比HuggingFace上直接获得的代码版本,Megatron-LLaMA能够取得176%的加速;在

QUIC协议报文解析(三)

在前面的两篇文字里我们简单介绍了QUIC的发展历史,优点以及QUIC协议的连接原理。本篇文章将会以具体的QUIC报文为例,详细介绍QUIC报文的结构以及各个字段的含义。早期QUIC版本众多,主要有谷歌家的gQUIC,以及IETF致力于将QUIC标准化,即IETFQUIC(iQUIC),还有Facebook家的mvfst

【C刷题训练营】第四讲(打好基础很重要)

前言:大家好,这是c语言刷题训练营的第四讲,打好基础便于对c语言语法与算法思维的提高,感谢你的来访与支持!💥🎈个人主页:​​​​​​Dream_Chaser~🎈💥✨✨刷题专栏:http://t.csdn.cn/baIPx⛳⛳本篇内容:c语言刷题训练营第四讲(牛客网)目录BC23-时间转换解题思路:BC24-总成

魔众文库系统 v5.3.0 小程序激励视频广告、下载收藏喜欢虚拟数量、用户注册站内信和欢迎邮件

魔众文库系统基于文档系统知识,建立平台与领域,打造流量、用户、付费和变现的闭环,帮助您更好的搭建文库系统。魔众文库系统发布v5.3.0版本,新功能和Bug修复累计13项,小程序激励视频广告、下载收藏喜欢虚拟数量、用户注册站内信和欢迎邮件。2023年09月18日魔众文库系统发布v5.3.0版本,增加了以下13个特性:·[

开箱即⽤!HashData 云数仓上线华为蓝鲸应⽤商城

近⽇,经过华为对企业技术、产品和服务能⼒的综合评估,酷克数据企业级云原⽣数据仓库HashData通过与华为OceanStorPacific分布式存储的适配与优化,形成⼀体化解决⽅案,成功上线华为蓝鲸应⽤商城。图1:华为蓝鲸商城HashData产品⻚⾯华为蓝鲸应⽤商城是华为数据存储产品线与合作伙伴联合打造的⼀站式IT应⽤

【无标题】

TCP简单的TCP协议的Python实现,包括服务器和客户端服务器端importsocket#定义服务器地址和端口号server_address=('localhost',8000)#创建TCP套接字server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREA

微服务简介

微服务简介微服务架构是一种软件架构模式,它将一个大型应用程序拆分为一组小型、独立的服务,每个服务都有自己的业务逻辑和数据存储。这些服务可以独立开发、部署和扩展,通常使用HTTP或其他轻量级通信协议进行通信。以下是微服务架构的一些关键特点和概念:微服务独立性:每个微服务都是独立的,拥有自己的数据库、业务逻辑和用户界面。这

MySQL的sql_mode合理设置

MySQL的sql_mode合理设置1、sql_mode设置介绍说明sql_mode是个很容易被忽视的变量,默认值是空值,在这种设置下是可以允许一些非法操作的,比如允许一些非法数据的插入。在生产环境必须将这个值设置为严格模式,所以开发、测试环境的数据库也必须要设置,这样在开发测试阶段就可以发现问题。showvariab

用于设计和分析具有恒定近心点半径的低推力螺旋轨迹研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。⛳️座右铭:行百里者,半于九十。📋📋📋本文目录如下:🎁🎁🎁目录💥1概述📚2运行结果🎉3参考文献🌈4Matlab代码实现💥1概述本文可用于设计和分析具有恒定近心点半径的低推力螺旋

亚马逊、沃尔玛测评养号、采退需要解决防关联哪些问题?

大家好我是跨境平台测评养号七年从事经验的珑哥。养号环境软件开发,深度解决平台矩阵养号防关联,砍单,F号问题。今天我给大家讲一下做亚马逊、沃尔玛测评项目需要用到的防关联、防封号环境的一些底层技术原理。这里讲的内容我相信很少有人能掌握,都是一些比较难的IT术技。如果你现在正考虑开始进行测评,那么在了解阶段,我建议你首先仔细

Mybatis自动映射Java对象 与 MySQL8后的JSON数据

文章目录Mybatis自动映射Java对象与MySQL8后的JSON数据1.转化成为正常Json类型1.1JsonTypeHander1.2ListJsonTypeHandler负责List<T>类型1.3实体类1.4mapper1.5测试类2.存储为携带类型的JsonMybatis自动映射Java对象与MySQL8后

热文推荐