当前位置: 首页 > article >正文

C++ 线程

来自《深入应用C++11 代码优化与工程级应用》

1.

#include <thread>

void func()
{
    //do some work
}

int main()
{
    std::thread t(func);
    t.join();

    return 0;
}

函数func将运行于线程对象t中,join函数会阻塞线程,直到线程函数执行结束。

2. 

#include <thread>
#include <iostream>
void func()
{
    //do some work
    std::cout<<__FILE__<<"["<<__LINE__<<"]"<<std::this_thread::get_id()<<'\n';
}

int main()
{
    std::thread t(func);
    std::cout<<__FILE__<<"["<<__LINE__<<"]"<<t.get_id()<<'\n';
    t.join();
    std::cout<<__FILE__<<"["<<__LINE__<<"]"<<std::thread::hardware_concurrency()<<'\n';
    std::cout<<__FILE__<<"["<<__LINE__<<"]"<<std::this_thread::get_id()<<'\n';
    return 0;
}

...\demo\main.cpp[12]2

..\demo\main.cpp[6]2

..\demo\main.cpp[14]8

..\demo\main.cpp[15]1

线程对象t的id是2

主线程的id是1

CPU核心数量是8

 线程对象就代表着一个线程。

需要注意线程对象的生命周期。

3.

#include <thread>
#include <iostream>
void func()
{
    //do some work
    std::cout<<__FILE__<<"["<<__LINE__<<"]"<<std::this_thread::get_id()<<'\n';
    std::this_thread::sleep_for(std::chrono::seconds(3));
    std::cout<<__FILE__<<"["<<__LINE__<<"]"<<std::this_thread::get_id()<<'\n';
}

int main()
{
    std::thread t(func);
    std::cout<<__FILE__<<"["<<__LINE__<<"]"<<t.get_id()<<'\n';
    t.join();
    std::cout<<__FILE__<<"["<<__LINE__<<"]"<<std::this_thread::get_id()<<'\n';
    return 0;
}

..\demo\main.cpp[14]2

..\demo\main.cpp[6]2

..\demo\main.cpp[8]2

..\demo\main.cpp[16]1

注意程序的执行顺序

4.

线程异步和线程同步

什么是线程同步和线程异步?_同步线程和异步线程-CSDN博客

5.线程异步操作函数async

#include <thread>
#include <future>
#include <iostream>


int main()
{
    std::cout<<__FILE__<<"["<<__LINE__<<"]"<<std::this_thread::get_id()<<'\n';
    std::future<int> f1 = std::async(std::launch::async,[](){
        std::cout<<__FILE__<<"["<<__LINE__<<"]"<<std::this_thread::get_id()<<'\n';
        std::this_thread::sleep_for(std::chrono::seconds(15));
        std::cout<<__FILE__<<"["<<__LINE__<<"]"<<std::this_thread::get_id()<<'\n';
        return 8;
    });
    std::cout<<__FILE__<<"["<<__LINE__<<"]"<<std::this_thread::get_id()<<'\n';
    std::cout<<f1.get()<<std::endl;
    std::this_thread::sleep_for(std::chrono::seconds(3));
    std::cout<<__FILE__<<"["<<__LINE__<<"]"<<std::this_thread::get_id()<<'\n';
    return 0;
}

 

 

可以看到,应该是第16行和第21行同时执行了。

实际的话:

 .\thread\main.cpp[21]1

..\thread\main.cpp[16]2

 std::launch::async

在调用async时就开始创建线程

修改代码:

 

std::launch::deferred

延迟加载方式创建线程。调用async时不创建线程,直到调用了future的get或者wait时才创建线程。


http://www.kler.cn/news/328667.html

相关文章:

  • Linux 应用层自定义协议与序列化
  • 【Java数据结构】 ArrayList 顺序表
  • Android-Handle消息传递和线程通信
  • LeetCode 面试经典150题 66.加一
  • 【数据类型】C和C++的区别
  • 【C#生态园】探索地理信息系统软件套件与库:功能、API和应用
  • CSS | CSS中强大的margin负边距
  • 深度学习中的卷积神经网络
  • Ubuntu安装Docker和Docker Compose
  • 高性价比PCB分板机高速主轴SycoTec 4025 HY
  • LeetCode 面试经典150题 172.阶乘后的零
  • PCL 最远点采样(FPS)
  • 微服务SpringSession解析部署使用全流程
  • 10.数据结构与算法-线性表的应用(线性表与有序表的合并)
  • 【K8S系列】深入解析 Kubernetes 网络策略(二)
  • Redis篇(Java操作Redis)
  • 微服务JSR303解析部署使用全流程
  • tailwindcss group-hover 不生效
  • Spring Boot驱动的足球青训俱乐部管理解决方案
  • 鹏哥C语言62---第9次作业:函数递归练习
  • 2025 年 IT 前景:机遇与挑战并存,人工智能和云计算成重点
  • 【Android 源码分析】Activity生命周期之onPause
  • local minima 的问题如何解决
  • .Net 基于IIS部署blazor webassembly或WebApi
  • 用Python+flask+mysql等开发的Excel数据资产落地工具
  • 【一文读懂】C#如何实现通用的排序功能
  • 车辆重识别(利用扩散模型合成有效数据进行行人再识别预训练)论文阅读2024/9/27
  • 【树莓派系列】树莓派首次开机配置
  • LeetCode 面试经典150题 50.Pow(x,n)
  • VMware 设置静态IP