首页 > 编程语言 >C++温故补缺(十五):多线程

C++温故补缺(十五):多线程

时间:2023-03-20 23:23:27浏览次数:46  
标签:多线程 C++ include 线程 func detach 温故

多线程

参考:CSDN,知乎

传统C++(C++11之前)中并没有引入线程的概念,如果想要在C++中实现多线程,需要借助操作系统平台提供的API,如Linux的<pthread.h>,或windows下的<windows.h>

从C++11开始提供了语言层面的多线程,包含在头文件<thread>中,它解决了跨平台的问题,并提供了管理线程,保护共享数据,线程间同步操作,原子操作等类。

何时使用并发?

程序使用并发的原因有两种。一是为了关注点分离;程序中需要执行不同的功能,就使用不同的线程来执行。二是为了提高性能,同时处理多个任务或者充分利用cpu资源,节省时间。

创建线程

创建线程用到thread类,用它来创建对象,其必须的参数是一个函数

#include<thread>
void fun(){}
thread th1(fun);

启用线程有两种方式,join和detach。join会阻塞父线程,等待子线程执行完,父线程才结束。而detach不会等待,一旦父线程执行完,未执行完的子线程被释放掉。

例子:

#include<iostream>
#include<thread>
#include<unistd.h>
using namespace std;
void func(){
    for(int i=0;i<3;i++){
        cout<<"func"<<endl;
        sleep(1);
    }
}

int main(){
    thread th1(func);
    th1.join();
    cout<<"main"<<endl;
    return 0;
}

join模式下,子现场把func()函数执行完,main线程才结束

修改成detach模式:

int main(){
    thread th1(func);
    th1.detach();
    cout<<"main"<<endl;
    return 0;
}

多线程

采用多线程和单线程执行两个函数对比

#include<iostream>
#include<thread>
#include<unistd.h>
#include<time.h>
using namespace std;
void func(){
    for(int i=0;i<3;i++){
        cout<<"func"<<" ";
        sleep(1);
    }
}
void func1(){
    for(int i=0;i<3;i++){
        cout<<"func1"<<" ";
        sleep(1);
    }
}

void Main(){
    func();
    func1();
}

void Main1(){
    thread th(func);
    thread th1(func1);
    th.join();
    th1.join();
}
int main(){
    time_t start=0,end=0;
    time(&start);
    Main();
    time(&end);
    cout<<"single thread exectime:"<<difftime(end,start)<<endl;
    time(&start);
    Main1();
    time(&end);
    cout<<"multi threads exectime:"<<difftime(end,start)<<endl;
}

多线程比单线程执行时间少了一半

标签:多线程,C++,include,线程,func,detach,温故
From: https://www.cnblogs.com/Tenerome/p/cppreview15.html

相关文章

  • C++温故补缺(十四):信号处理
    信号处理信号是由操作系统传给进程的中断,能够提前终止一个程序。在Unix,Linux,MacOS或Windows系统上,都可以通过Ctrl+C产生中断。下面是可以在程序中被捕获的信号,并且可......
  • C++温故补缺(十三):模板
    C++模板模板是泛型的基础,泛型编程就是一种独立于任何特殊类型的方式编写代码。模板就是创建泛型类或泛型函数的蓝图。STL库中的几个数据结构(vector,list,map等)以及算法......
  • C++温故补缺(十二):动态内存
    C++动态内存同C,C++中也是有堆和栈的概念。栈是函数内部声明的所有变量都所占用空间,堆是程序中未使用的内存,在程序运行期间可用于动态分配。同样也有alloc()分配内存,新增......
  • C++温故补缺(十一):异常
    异常处理参考:cnblogs异常和错误(bug)异常:是程序开发过程中必须考虑的一些特殊情况,是程序运行时可以预料的执行分支。异常是不可以避免的,如0除问题,数组越界问题,文件不存在......
  • C++温故补缺(十):C++文件读写和流
    C++文件和流C++文件的读写流用的是fstream库,它定义了三个新的数据类型:数据类型描述ofstream该数据类型表示输出文件流,用于创建文件并向文件写入信息。ifstr......
  • Java EasyExcel带格式多线程导出百万数据
     JavaEasyExcel带格式多线程导出百万数据1.背景说明2.方案概述(1)大数据量导出问题主要是以下三个地方:(2)将写入导出Excel等功能单独分开成一个微服务:(3)注意:(4)方......
  • Lniux有关python多线程的历史
    在内核2.6以前的调度实体都是进程,内核并没有真正支持线程。它是能过一个系统调用clone()来实现的,这个调用创建了一份调用进程的拷贝,跟fork()不同的是,这份进程拷贝完全共......
  • 多线程面试——CountDownLatch,CyclicBarrier,Semaphore
    0.总结1.CountDownLatch是1个线程等待其他线程,CyclicBarrier是多个线程相互等待;2.CountDownLatch是计数-1,直到减为0,CyclicBarrier是计数+1,直到达到指定值;3.CountDownLatch......
  • 面试高频问题之C++11新特性
    背景C++11是C++语言的一个重大更新,引入了许多新特性,包括自动类型推导、lambda表达式、右值引用、智能指针等等。这些新特性使得C++更加现代化、高效、易用。也是面试容很容......
  • 面试高频问题之C++11新特性
    背景C++11是C++语言的一个重大更新,引入了许多新特性,包括自动类型推导、lambda表达式、右值引用、智能指针等等。这些新特性使得C++更加现代化、高效、易用。也是面试容很......