c++线程库学习记录

1、什么时候需要开线程,为什么要开线程

      之前看了几篇博文,讲的都很好,但是非专业的人可能还是一头雾水;当然我也是非专业的,先把我自己的理解先写一下(不一定对):提到线程,一定少不了进程,实际上这两者确实有很大的联系。

        大家打开自己电脑的任务管理器,就可以看到在电脑上正在运行的进程,那简单来说进程实际上就是运行在电脑上的软件,这个进程有自己的执行环境,比如寄存器,内存等等,就是很多博文中都提到的进程的上下文,对应英文的context,这个词就很奇妙,翻成上下文反而很难理解,我也没有很好的解释,大家意会吧。。那么线程就是在进程内部的各部分功能。比如一个软件(进程)在运行过程中肯定不是一条逻辑运行到底,而是由多个程序块的构成的,那每个程序块的执行就可以开一个线程来进行。

       那为什么要开线程执行程序块呢?首先,程序的执行过程是先准备好各部分所需要的资源,然后运行代码的时候,分配cpu来编译和执行指令,cpu执行代码是一个一个轮流执行的,但是cpu的速度非常的快,其他设备或者内存却很慢,如果一条逻辑运行到底,那cpu飞快的执行完,然后就等其他设备的响应,等他们响应完后有一个标志再开始执行下一条,就很浪费cpu,开线程的目的也就是让cpu不需要等待其他设备的执行完成命令,就可以去执行下一条,而cpu飞快的轮流处理完了所有的事情,其他设备一一响应,外在表现为仿佛是同时在执行。

      描述一个任务:打开一个外部设备进行采集数据,将其数据读取回来并且可视化。在这个任务中,cpu要做的事情是打开设备,接收数据,打开可视化功能。采集数据是外部设备的事情,可视化是可视化模块的事情,那么就可以开两个线程,一个用于不断的接收数据,一个用于将接收的数据可视化。

2、如何开线程

      c++中包含有一个线程库,可以启动和管理线程。启动线程首先包含这个线程库,然后创建一个线程实例,传入一个需要执行的函数的指针,如果函数有参数,则在函数指针后直接输入参数即可,用逗号隔开。创建完成就会自动启动。

#include <thread>
#include <iostream>
using namespace std;

void test(){
 cout<<"this is the function needs to operation" <<endl;
}

int main()
{
//创建线程实例
thread t(test);
cout<<"the thread ID is"<<this_thread::get_id()<<endl;
t.join();//线程的函数,用于让主线程在所有子线程执行结束后再退出
return 0;
}

开启一个线程后,就会有一个唯一的用于识别该线程的ID,并且库中提供了get_id()方法返回该ID。当前进程可用this_thread来访问。也可以使用lambda表达式来替换函数指针。

3、补充

     thread::join()可以说是必须使用的,否则主程序很可能已经执行完并且return了,但是子线程还没有执行结束,毕竟主程序只需创建线程实例即可,相对于一些子线程是比较快的。

    除此之外,还可以使用thread::detach()将子线程的待执行函数与子线程对象分离,子线程可以单独进行,执行完毕后再释放给子线程分配的资源。将两者分开可是实现当线程对象析构时,线程函数还会再后台执行,但是当主线程退出时并不能保证子线程执行完毕。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值