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

P62 线程

这篇文章我们来讲一下线程。截止到目前,我们的代码都是在单线程上运行的,现在看起来没有什么问题,但是目前所有的计算机几乎都不只有一个逻辑线程,所以如果我们一直使用单线程运行,这样的话效率会很低。尤其是如果我们运行一些繁重的工作,那么很有可能我们就需要计算机并行执行一些功能。

举个简单的例子,我们有一个等待接收用户指令的函数,那么在等待用户输入指令的过程当中,我们有可能希望程序执行一些其他事情,那么我们就需要有一条线程在等待用户,而另一条线程在执行其他事情。

#include<iostream>
#include<string>
#include<thread>

void DoWork() {

}

int main() {
    std::thread worker(DoWork);
    worker.join();
    std::cin.get();
}

运行一下,会发现没有东西,但是也没啥问题。我们的std::thread worker函数可以接受一个函数指针,此时我们就开辟了另一个线程,而这个线程上完成的就是函数指针指向的函数里面的任务。运行到这段代码之后,我们的worker线程就开始工作了。而worker.join是个什么意思呢?它的含义是,我们会在主线程上做一个阻塞,让主线程暂时不会继续运行,一直等到我们的worker线程运行完毕,然后才会接着运行。我们可以举一个例子来看看。比如我们在主线程和worker线程上同时进行一些打印操作,并刻意的使得worker线程的运行速度比较慢,来看看会发生什么。

#include<iostream>
#include<string>
#include<thread>

void DoWork() {
    using namespace std::literals::chrono_literals;
    std::this_thread::sleep_for(1s);
    std::cout << "Worker thread is finished!" << std::endl;
}

int main() {
    std::thread worker(DoWork);
    std::cout << "Now we are on the main thread" << std::endl;
    worker.join();
    std::cin.get();
}

然后我们看一下结果

可以看到,我们先打印了主线程的话,然后打印了worker线程的。那么如果我们在join函数之后打印主线程会发生什么?

int main() {
    std::thread worker(DoWork);
    worker.join();
    std::cout << "Now we are on the main thread" << std::endl;
    std::cin.get();
}

我们现在这样修改main函数,然后我们看一下结果

可以发现因为join函数的存在,导致我们不得不在主线程等待分支线程结束,然后我们才能继续我们主线程的打印。

最后,我们还可以使用std::this_thread::get_id()来获得当前线程的线程id。

可以看到两者的值是不同的,所以分线程和主线程确实是两条不同的线程。

好了以上就是有关于线程知识的初步介绍,希望大家能够喜欢!

相关文章:

  • React Native 0.76 升级后 APK 体积增大的原因及优化方案
  • Selenium 元素定位方法及最佳实践
  • 面试基础---分布式架构基础:CAP 理论与 BASE
  • DeepSeek大语言模型下几个常用术语
  • MySQL和Hive SQL 时间处理常用函数汇总
  • 字符串字典树-依依的瓶中信
  • 深度洞察!树莓集团南京产业园再布局的核心逻辑
  • 网络运维学习笔记(DeepSeek优化版) 013网工初级(HCIA-Datacom与CCNA-EI)ACL访问控制列表
  • 项目中同时使用Redis(lettuce)和Redisson的报错
  • 服务器带宽堵塞会对网站访问产生哪些影响?
  • 打破界限!家电行业3D数字化营销,线上线下无缝对接
  • Yashan DB 体系结构
  • 初识云计算
  • 【FastAPI】 AI场景快速学习指南
  • JS采集数据爬虫-Fetch API 和 XMLHttpRequest 有什么区别?
  • 影刀 RPA 实战开发阶段总结
  • Linux--如何安装rockyLinux9虚拟机
  • 3D匹配算法简述
  • OpenCV计算摄影学(19)非真实感渲染(Non-Photorealistic Rendering, NPR)
  • Vue入门常见指令
  • 手机web网站开发软件有/在线外链
  • 律师个人网站源码/免费开通网站
  • 徐州市网站/江苏网站建站系统哪家好
  • 做网站的画布是多少/百度竞价推广的技巧
  • 清远网站制作/白银网站seo
  • 酒店网站建设策划方案/商业软文