全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

c++如何实现多线程编程_c++ std::thread使用方法

C++多线程编程通过std::thread实现,支持函数、Lambda创建线程,可传值或引用参数,需调用join()或detach()管理线程生命周期,并可使用hardware_concurrency()获取硬件并发数。

C++ 实现多线程编程主要通过标准库中的 std::thread 来完成。从 C++11 开始,C++ 标准提供了对多线程的原生支持,使得开发者无需依赖第三方库(如 pthread)也能轻松编写跨平台的多线程程序。

创建和启动线程

使用 std::thread 可以通过函数、函数对象、Lambda 表达式等方式创建线程。

基本语法:

  • 包含头文件:#include
  • 构造一个 thread 对象并传入可调用目标
示例1:使用普通函数
#include 
#include 

void say_hello() {
    std::cout << "Hello from thread!" << std::endl;
}

int main() {
    std::thread t(say_hello);  // 启动新线程执行 say_hello
    t.join();  // 等待线程结束
    return 0;
}
示例2:使用 Lambda 表达式
#include 
#include 

int main() {
    std::thread t([](){
        std::cout << "Lambda in thread" << std::endl;
    });
    t.join();
    return 0;
}

传递参数给线程函数

向线程函数传递参数时,需在构造 thread 对象时一并传入。注意:默认是值传递,若要引用传递,必须使用 std::ref

示例:传参与引用传递
#include 
#include 

void print_num(int n, std::string& msg) {
    n += 10;
    msg += " (modified)";
    std::cout << "n = " << n << ", msg = " << msg << std::endl;
}

int main() {
    int val = 5;
    std::string str = "Hello";

    std::thread t(print_num, val, std::ref(str));  // 引用传递 str
    t.join();

    std::cout << "After thread: val = " << val << ", str = " << str << std::endl;
    return 0;
}

输出中可以看到,val 的修改在线程内无效(值传递),而 str 被修改了(引用传递)。

线程的等待与分离

每个 thread 对象有两种运行模式:

  • join():主线程等待该线程执行完毕
  • detach():线程与主线程分离,独立运行(后台运行)

必须在 thread 对象销毁前调用其中之一,否则程序会终止(调用 std::terminate)。

示例:分离线程
#include 
#include 
#include 

void background_task() {
    std::this_thread::sleep_for(std::chrono::seconds(2));
    std::cout << "Background task done." << std::endl;
}

int main() {
    std::thread t(background_task);
    t.detach();  // 分离线程

    std::cout << "Main thread continues..." << std::endl;
    std::this_thread::sleep_for(std::chrono::seconds(3));  // 确保主线程不立即退出
    return 0;
}

获取硬件支持的并发线程数

可以使用 std::thread::hardware_concurrency() 查询系统建议的最大并发线程数。

unsigned int max_threads = std::thread::hardware_concurrency();
std::cout << "Supports " << max_threads << " concurrent threads.\n";

这个值只是一个提示,可能返回 0(表示无法确定)。

基本上就这些。掌握 std::thread 的创建、参数传递、生命周期管理,就能应对大多数基础多线程场景。实际开发中常配合 mutex、条件变量等同步机制使用,避免数据竞争。


# ai  # c++  # ios  # stream  # 同步机制  # 标准库  # include  # Lambda  # 引用参数  # 线程  # 多线程  # 线程生命周期  # 主线程  # Thread  # 值传递  # 引用传递  # 并发  # 对象  # 就能  # 也能  # 可以通过  # 可以看到  # 可以使用  # 并可  # 只是一个  # 有两种  # 第三方 


相关文章: 如何快速搭建FTP站点实现文件共享?  微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?  广州美橙建站如何快速搭建多端合一网站?  专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?  Swift中循环语句中的转移语句 break 和 continue  如何在Windows 2008云服务器安全搭建网站?  较简单的网站制作软件有哪些,手机版网页制作用什么软件?  如何通过wdcp面板快速创建网站?  C#如何序列化对象为XML XmlSerializer用法  建站之星后台管理系统如何操作?  教学论文网站制作软件有哪些,写论文用什么软件 ?  专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  南平网站制作公司,2025年南平市事业单位报名时间?  如何将凡科建站内容保存为本地文件?  如何在阿里云高效完成企业建站全流程?  如何在西部数码注册域名并快速搭建网站?  山东网站制作公司有哪些,山东大源集团官网?  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  陕西网站制作公司有哪些,陕西凌云电器有限公司官网?  MySQL查询结果复制到新表的方法(更新、插入)  如何高效完成独享虚拟主机建站?  制作宣传网站的软件,小红书可以宣传网站吗?  如何在Golang中指定模块版本_使用go.mod控制版本号  寿县云建站:智能SEO优化与多行业模板快速上线指南  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  建站之星各版本价格是多少?  如何使用Golang table-driven基准测试_多组数据测量函数效率  商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?  北京网站制作网页,网站升级改版需要多久?  C#如何使用XPathNavigator高效查询XML  建站之星微信建站一键生成小程序+多端营销系统  如何快速搭建自助建站会员专属系统?  建站主机空间推荐 高性价比配置与快速部署方案解析  深圳 网站制作,深圳招聘网站哪个比较好一点啊?  企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?  如何选择高效可靠的多用户建站源码资源?  Python路径拼接规范_跨平台处理说明【指导】  javascript中对象的定义、使用以及对象和原型链操作小结  公司门户网站制作流程,华为官网怎么做?  制作网站的基本流程,设计网站的软件是什么?  C#怎么使用委托和事件 C# delegate与event编程方法  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  零服务器AI建站解决方案:快速部署与云端平台低成本实践  建站之星北京办公室:智能建站系统与小程序生成方案解析  开封网站制作公司,网络用语开封是什么意思?  表情包在线制作网站免费,表情包怎么弄?  黑客如何通过漏洞一步步攻陷网站服务器?  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  宝塔建站无法访问?如何排查配置与端口问题? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。