当前位置: 首页 > 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/a/328667.html

相关文章:

  • DeepSeek的崛起与全球科技市场的震荡
  • LitGPT - 20多个高性能LLM,具有预训练、微调和大规模部署的recipes
  • floodfill算法(6题)
  • Java 知识速记:全面解析 final 关键字
  • NLP自然语言处理通识
  • MotionLCM 部署笔记
  • 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次作业:函数递归练习