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

【C++】多线程

多任务处理有两种形式,即:多进程和多线程。

  1. 基于进程的多任务处理是程序的并发执行。
  2. 基于线程的多任务处理是同一程序的片段的并发执行

文章目录

    • 1. 多线程介绍
    • 2. Windows多线程

1. 多线程介绍

每一个进程(可执行程序)都有一个主线程,这个主线程是唯一的,自动创建的,即:一个进程中只有一个主线程,自己创建的线程一般称为子线程。

join():等待或者阻塞,阻塞主线程的执行,直到子线程调用结束,然后子线程与主线程汇合,继续向下走。

detach():分离,即主线程与子线程各自执行,一旦detach(),这个主线程对象就会失去与这个主线程的关联,这个子线程就相当于被c++运行时库接管,由运行时库负责清理相关的资源。一旦调用了detach(),就不能再用join(),否则系统会报错。这是由于detach()之后,两条线程的执行速度不一致导致的。

joinable():判断是否可以成功使用join()或detach()的。

lock():使用互斥量进行共享内存保护的时候,一般情况是在所需要进行保护的代码段进行lock()操作,只有lock()成功时,代码才能继续执行,否则就会一直lock()不在向下执行,直到lock()成功。

std::lock_guard():类模板,直接取代lock()与unlock(),用了lock_guard()之后,就不能在使用lock()与unlock();

2. Windows多线程

Windows编写多线程C++程序需要包含头文件:#include <thread>

多线程实例:

#include <iostream>
#include <thread>using namespace std;
void print();void print()
{cout << "-----------thread test-------------" << endl;
}class test {
public:// operator()() - 重载运算符+参数传递void operator()() {cout << "class subthread starting!!!" << endl;cout << "class subthread over!!!" << endl;}void operator()(int x,int y) {cout << "x+y=" << x+y << endl;}
};int main()
{cout << "主线程id:" << this_thread::get_id() << endl;// 线程休眠 - 不同的时间表示std::this_thread::sleep_for(std::chrono::seconds(1));   //1秒 = 1000毫秒=10^6微秒cout << "1s\n";
#if 0std::this_thread::sleep_for(std::chrono::microseconds(2 * 1000000));  //微秒cout << "2s\n";std::this_thread::sleep_for(std::chrono::milliseconds(3000));  //毫秒cout << "3s\n";std::this_thread::sleep_for(std::chrono::minutes(1));cout << "1min\n";std::this_thread::sleep_for(std::chrono::hours(1));cout << "1hour\n";
#endif// 创建子线程cout << "\n子线程1!!!" << endl;thread v1(print);	//入口函数printv1.join();	//加入主线程// 是否可joinable()if (v1.joinable()) {cout << "可以调用join()或者detach()" << endl;}else {cout << "不可以调用join()或者detach()" << endl;}cout << "\n子线程2!!!" << endl;test v2;thread t2(v2);t2.join();cout << "\n子线程3!!!" << endl;test v3;thread t3(v3,2,4);t3.join();return 0;
}

运行结果如下:

在这里插入图片描述

以上。

http://www.lryc.cn/news/15287.html

相关文章:

  • 0202插入删除-算法第四版红黑树-红黑树-数据结构和算法(Java)
  • vue 生成二维码插件 vue-qr使用方法
  • 网络工程课(二)
  • Pytorch并行计算(三): 梯度累加
  • 蓝桥杯入门即劝退(十八)最小覆盖子串(滑动窗口解法)
  • Android一~
  • 一月券商金工精选
  • UML中常见的9种图
  • 使用SpringBoot实现无限级评论回复功能
  • Kafka 介绍和使用
  • [学习笔记]Rocket.Chat业务数据备份
  • 【ZOJ 1090】The Circumference of the Circle 题解(海伦公式+正弦定理推论)
  • 【go】slice原理
  • 【数据库】MySQL概念知识语法-基础篇(DQL),真的很详细,一篇文章你就会了
  • 博客界的至高神:属于自己的WordPress网站,你值得拥有!
  • 操作系统(day13)-- 虚拟内存;页面分配策略
  • SQL零基础入门学习(四)
  • 19岁就患老年痴呆!这些前兆别忽视!
  • 【C++】thread|mutex|atomic|condition_variable
  • 学成在线项目笔记
  • FreeRTOS队列
  • rancher2安装nfs-subdir-external-provisioner为PVC/PV动态提供存储空间(动态分配卷)
  • 1.JAVA-JDK安装
  • Java必备小知识点4——数据类型、数组、位运算符
  • 麦克风分类汇总
  • 九龙证券|机制改革激发转融券活力 全面注册制释放两融展业新空间
  • 6——JVM调优工具详解及调优实战
  • AcWing语法基础课笔记 第八章 C++ STL 第九章 位运算与常用库函数
  • Qt中的多线程
  • React-Hooks怎样封装防抖和节流-面试真题