C++并发编程(1):基本概念、线程管控

news2024/11/18 11:43:51

学习视频与书籍

学习视频

c++11并发与多线程视频课程

学习书籍

我本来打算去图书馆借《C++新经典》的,偶然发现这本书,如获至宝

在这里插入图片描述

  • 书挺新的,我看译者序是21年10月
  • 这本书挺贵的,后面写着139.80,大家还是去图书馆借吧
  • 作为基础与入门我觉得看前5章应该就够了

基本概念

C++11并发与多线程笔记(1) 并发基本概念及实现,进程、线程基本概念

进程

运行起来的可执行程序

线程

  • 每个进程都有一个主线程
  • 主线程随着进程的启动而启动
  • 同一个进程可以通过代码创建其它线程
  • 线程用来执行代码,可以理解为代码的执行通路

在这里插入图片描述

  • 线程的存在使得可以在同一时刻干多个不同的事

💡 线程并不是越多越好,每个线程,都需要一个独立的堆栈空间(大约1M),线程之间的切换要保存很多中间状态,切换也会耗费本该属于程序运行的时间

在这里插入图片描述

并发

多进程并发

  • 比如账号服务器一个进程,游戏服务器一个进程
  • 服务器进程之间存在通信(同一个电脑上:管道,文件,消息队列,共享内存;不同电脑上:socket通信技术)

多线程并发

  • 线程像是轻量级的进程。每个进程有自己独立的运行路径,但一个进程中的所有线程共享地址空间(共享内存),全局变量、全局内存、全局引用都可以在线程之间传递,所以多线程开销远远小于多进程
  • 多进程并发和多线程并发可以混合使用,但建议优先考虑多线程技术

线程管控

线程的基本管控

基本操作

  • 包含头文件
  • 构造std::thread实例
  • 向该实例提供可调用对象

💡 新线程必须包含入口函数

可调用函数对象包括:

  • 函数
  • 函数指针
  • lambda表达式
  • bind创建的对象
  • 函数对象(仿函数)

实例

#include <thread>
#include <iostream>

using namespace std;

class MyPrint
{
public:
    MyPrint()
    {
        cout << "默认构造函数...." << endl;
    }
    void operator()()
    {
        cout << "线程开始执行!" << endl;

        cout << "线程结束执行!" << endl;
    }
    ~MyPrint()
    {
        cout << "析构函数...." << endl;
    }
};

int main()
{
    // MyPrint myprint;
    thread my_thread{MyPrint()};
    if(my_thread.joinable())
    {
        cout << "Thread joinable...." << endl;
        // my_thread.join();
        my_thread.detach();
    }
    else
    {
        cout << "Unable to join...." << endl;
    }

    cout << "Life is for coding!" << endl;
    
    return 0;
}

注意点:

  • 将函数对象传递给thread构造函数时,实际调用了类的默认拷贝构造函数,内存中多了一份数据
  • 类必须重载函数操作符( ),才可作为参数传递给thread对象
  • 传递匿名对象是要用大括号
  • join( )阻塞主线程,主线程等待所有次线程完成后运行后续语句
  • detach( )主线程、次线程各走各的,主线程结束后次线程在后台继续运行但无显示和输出
  • 使用join( )和detach( )前先用joinable( )进行判断

变量生存期问题

次线程可能会访问外部数据,如局部变量等

若是函数内的局部变量,函数运行结束局部变量即销毁,此时访问该变量会产生未定义行为

可以理解为野指针或浅拷贝的问题

在这里插入图片描述

在这里插入图片描述

解决方法:

  1. 将数据复制到新线程内部,而不是共享数据
  2. 在函数中汇合新线程,确保函数退出前新线程执行完毕

对‘pthread_create’未定义的引用

我是在Linux下编程,没用gcc进行编译,写的CMakeLists.txt,在build目录下make时报错

对‘pthread_create’未定义的引用

gcc编译报错的解决

对pthread_create未定义的引用

因为还未详细用到pthread,先列出以供后续了解

pthread与std::thread的区别与应用

C++多线程pthread和thread

应该是我CMakeLists.txt写的不对,参考

c++多线程 CMakeLists设置

我的CMakeLists.txt更改如下:

cmake_minimum_required(VERSION 2.8)
project(Cplus_learning)

SET(CMAKE_CXX_COMPILER "g++") 

#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread")

set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) 

# add_subdirectory(src bin)

add_executable(thread_01 src/thread_01.cpp)

可以正常编译并运行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/756606.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux驱动之字符设备驱动框架与示例模板

目录 一、字符设备驱动简介 二、字符设备驱动开发步骤 1.确定设备号 2.定义 file_operations 结构体 3.实现操作函数 4.注册和注销字符设备 5.编译和加载模块 6.用户空间交互&#xff1a; 三、字符设备驱动示例模板 四、字符设备驱动开发总结 一、字符设备驱动简介 字…

未来Mac下载站怎么打不开了

重要公告&#xff1a; 未来软件园因业务需要现更换域名 原域名&#xff1a;Mac.orsoon.com 更为新域名&#xff1a;未来mac下载-Mac软件-mac软件下载-mac软件大全 程序已全面转移&#xff0c;请访问新域名

MySQL中的索引和事务 (数据库系列5)

目录 前言&#xff1a; 1.索引 1.1 索引的概念 1.2索引的作用 1.3索引的使用场景 1.4索引的使用 1.4.1查看索引 1.4.2创建索引 1.4.3删除索引 1.5索引背后的数据结构 1.5.1 B-树 1.5.2 B树 2.事务 2.1事务的概念 2.2数据库事务的四个特性 2.2.1原子性 2.2.2一…

城会玩,Selenium+Docker成功解决这一大难题

01、需求背景 日常测试中会遇到对web应用进行UI自动化的测试场景&#xff0c;一般常用的工具是使用Selenium&#xff0c;一套简单的UI自动化架构如下&#xff1a; 上图即为简单搭建的一套UI自动化测试架构&#xff0c;但 串行执行测试用例&#xff1a; 一台机器只能安装一个…

《英雄联盟》提示丢失D3DCompiler_43.dll的三个解决方法

在我们打开游戏《英雄联盟》的时候&#xff0c;计算机报错提示“由于找不到D3DCompiler_43.dll&#xff0c;无法继续执行此代码”&#xff0c;“D3DCompiler_43.dll丢失”是怎么回事呢&#xff1f;D3DCompiler_43.dll是一个Microsoft DirectX的组件文件&#xff0c;它是用于编译…

博客系统(使用前后端分离)

博客系统 前言一.准备工作1.1 准备好前端文件1.2 设计数据库1.3 编写基本的数据库代码1.4 封装好数据库的连接操作1.5 根据设计的表创建实体类1.6 根据实体类,提供一些简单的增删改查操作 二.博客要实现的功能2.1 博客列表页功能2.2 博客详情页2.3 博客登录页2.4 页面强制登录功…

涵子来信——AI的无限未来——谈谈想法

大家好&#xff1a; 这一次&#xff0c;我想要跟大家讲一讲我对AI的看法和未来的展望&#xff0c;谈谈我的想法。 AI&#xff08;Artificial Intelligence&#xff0c;中文人工智能&#xff09;&#xff0c;是我们生活中处处都可以见到的&#xff0c;小到一个语音助手&#x…

ylb-接口13实名认证

总览&#xff1a; 在api模块下的service包&#xff0c;创建一个充值接口RechargeService&#xff0c;并创建一个&#xff08;根据userID查询它的充值记录&#xff09;方法&#xff1a; package com.bjpowernode.api.service;import com.bjpowernode.api.model.RechargeRecord…

迪赛智慧数——柱状图(多色柱状图):旅行灵感来源

效果图 涉足旅行就是一次睿智的选择&#xff0c;心系未来、永不停步&#xff0c;让精神和思维得到滋养&#xff0c;更加懂得珍惜和感恩&#xff0c;这是旅行给予生活的灵感。西方一位哲人也说过&#xff0c;“生命的意义在于尝试&#xff0c;体验不同的可能”&#xff0c;旅行能…

基于springboot+Redis的前后端分离项目(九)-【黑马点评】

&#x1f381;&#x1f381;资源文件分享 链接&#xff1a;https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA?pwdeh11 提取码&#xff1a;eh11 附近的商户、用户签到、UV统计 &#xff08;一&#xff09;附近的商户1.附近商户-GEO数据结构的基本用法2.附近商户-导入店铺数据到…

Python实现登陆界面+生日界面

文章目录 1. 需求分析1.1 功能分析1.2 性能分析 2. 技术原理3. 详细设计3.1 登录界面3.2 注册界面3.3 修改密码3.4 注销账户3.5 生日界面 4. 功能实现4.1 登陆界面4.2 注册界面4.3 修改密码4.4 注销账户4.5 生日界面 1. 需求分析 1.1 功能分析 ① 登录界面实现用户的登录、注…

消费者行为分析VR情景模拟演练系统

VR虚拟现实技术是一种先进的技术&#xff0c;利用VR开展消费者行为分析课程是一种创新的教育方式&#xff0c;它可以提高学生的学习兴趣和效果&#xff0c;同时也可以为企业提供更好的人才培训和发展机会。 1.帮助学生更好地理解和应用心理学概念&#xff1a;VR技术可以让学生…

【Vite搭建Vue3项目】如何使用自定义的svg

Vite搭建Vue3项目如何使用自定义的svg 1. 准备一份svg图标集放入到自己想放的目录2. 下载对应的插件并进行配置3. 测试使用 绪论&#xff1a;当用 vite 构建 vue3 项目的时候&#xff0c;咱可以使用 Element-plus 为我们提供的图标&#xff0c;但是它是一个个标签&#xff0c;当…

HTTP1.1 wireshark分析

本地springboot启动一个简单的服务&#xff0c;然后请求测试 tcpdump -i lo0 -nnvv -w tmp.cap tcpdump 本地回环网卡 http1.1 HTTP/1.0 每进行一次通信&#xff0c;都需要经历建立连接、传输数据和断开连接三个阶段。当一个页面引用了较多的外部文件时&#xff0c;这个建立…

两种异步日志方案的介绍

文章目录 一、日志写入逻辑1.1 相关接口函数1.2 写入逻辑 二、log4cpp 日志框架2.1 下载和编译2.2 日志级别2.3 日志格式2.4 日志输出2.5 日志回滚 三、muduo 异步日志库3.1 异步日志机制3.2 双缓冲机制3.3 前端日志写入3.4 后端日志落盘3.5 coredump 查找未落盘的日志3.6 总结…

复习第六课 C语言-排序,初识指针

目录 【1】冒泡排序&#xff08;从小到大&#xff09; 【2】选择排序 【3】二维数组 【4】指针 【5】指针修饰 【6】大小端 【7】初见二级指针 练习&#xff1a; 【1】冒泡排序&#xff08;从小到大&#xff09; #include <stdio.h> //数组哪里的\0?自己和字符串…

论文阅读-2:基于深度学习的大尺度遥感图像建筑物分割研究

一、该网络中采用了上下文信息捕获模块。通过扩大感受野&#xff0c;在保留细节信息的同时&#xff0c;在中心部分进行多尺度特征的融合&#xff0c;缓解了传统算法中细节信息丢失的问题&#xff1b;通过自适应地融合局部语义特征&#xff0c;该网络在空间特征和通道特征之间建…

SSH框架简介篇

文章目录 概述目录结构 strutsSpringHibernate总结 概述 SSH框架&#xff08;Struts Spring Hibernate&#xff09;是一种广泛应用的Java企业级开发框架组合&#xff0c;它将Struts、Spring和Hibernate三个优秀的框架有机地结合在一起&#xff0c;提供了一套完整的解决方案&…

cmake 函数相关

目录 cmake函数和宏基础 demo cmake函数和宏的参数处理 cmake函数和宏的基本使用 demo cmake函数和宏使用变量 demo demo cmake函数和宏需要注意的地方 demo cmake函数和宏的关键字参数 demo 使用第二种形式cmake_parse_arguments() demo 关键字list demo singl…

GDB 调试代码

目录 一、其他调试代码的工具 二、GDB调试 1、调试准备 2、开始调试 3、调试命令 1.运行程序 2.退出gdb 3.传参 4.查看代码 5.设置或删除断点及相关操作 6.继续运行 7.运行中打印某些值及其类型 8.自动的打印某些值和信息及其相关操作 9.单步调试 10.设置变量的…