- 博客(56)
- 收藏
- 关注
原创 C++并发编程 -7. 并发代码设计
由于counter是全局变量,当多个线程同时调用processing_loop去修改同一个变量,这就要求counter在缓存内做一份拷贝,再改变自己的值,或其他线程以发布的方式对缓存中的拷贝副本进行更新。虽然为每个线程分配不同的数据块,但工作的划分(无论是之前就划分好,还是使用递归的方式划分)仍然在理论阶段,因为这里每个线程对每个数据块的操作是相同的。根据线程的操作性质,以及使用到的内存序,这样的修改可能会让第二个处理器停下来,等待硬件内存更新缓存中的数据。这样,每个线程访问的数据项就不会互相干扰。
2025-03-26 17:39:00
629
原创 C++并发编程 -6. 无锁并发数据结构设计
风险指针”是指Maged Michael发明的一种技法, 后来被IBM申请为专利。简言之可以将要删除的节点进行特殊处理,如果有线程正在使用我们将这个节点的指针标记为风险指针,其他线程不可删除。我们实现hazard_pointer类,管理风险指针和线程id。id为正在使用该风险指针的id,pointer为指针类型,存储的节点数据地址。当一个线程从风险数组中查找某个闲置节点作为风险节点,则需要将pointer指向节点的数据,并且将id设置为当前的线程id。定义一个全局的风险节点数组,用来存储风险节点。
2025-03-10 17:45:35
840
原创 C++并发编程 -5. 基于锁实现线程安全的队列和栈容器
如何通过互斥锁和条件变量构建线程安全的队列(栈)在已经介绍过构建线程安全的栈,现在重新回顾。
2024-03-07 16:17:57
1309
1
原创 C++并发编程 -4.原子操作和内存模型
原子操作是一类不可分割的操作,当这样操作在任意线程中进行一半的时候,你是不能查看的;它的状态要不就是完成,要不就是未完成。如果从对象中读取一个值的操作是原子的,并且对对象的所有修改也都是原子的话,那么加载操作要不就会检索对象初始化的值,要不就将值存在某一次修改中。说白了原子操作就是不可中断的操作,要么被执行要不不被执行。
2024-03-01 15:16:47
2754
原创 C++并发编程 -2.线程间共享数据
本章就以在C++中进行安全的数据共享为主题。避免上述及其他潜在问题的发生的同时,将共享数据的优势发挥到最大。
2024-02-02 10:49:01
1615
原创 C++并发编程 -1.线程管理
本栏主要介绍《C++并发实战编程》这本书,。将按照书目录分为 九章节介绍C++并发编程,尽可能简化本书内晦涩难懂知识点。本章节主要讲解线程使用基础。详细介绍线程使用基础(线程发起、等待、参数、异常处理)、线程管控(归属权、并发数量等)。
2024-01-23 16:14:52
1049
原创 C++11常用关键字
auto早在C++98标准引入,在98标准含义为:声明变量拥有自动周期,但是这本身就是多余在C++11中auto全新定义:变量的自动类型推断const是c++本来就有的关键字,用来表示只读状态,但是通过一些手段还是可以进行修改,比如使用const_cast或者使用指针强项篡改。而constexpr才是真正意义上的常量,constexpr修饰的变量必须是在编译期间就可以确定的值,如果无法再编译期间确定,那么就会报错。
2023-12-31 17:24:04
1216
1
原创 C++ lambda表达式
Lambda表达式是C++11标准引入的一种特性,它提供了一种方便的方式来定义匿名函数。Lambda表达式是一种能够捕捉外部变量并使用它们的函数对象。由捕获列表、参数列表、返回类型和函数体组成;其中,参数列表和返回类型可以忽略,但不可以忽略捕获列表和函数体。[捕获列表](参数列表) -> 返回类型 {函数体}例如:auto f = []{ return 1 + 2;或者 auto f = [](int x, int y)->int{ return x + y;(在后面章节会详细介绍使用规则.)
2023-09-05 16:49:50
7212
原创 C++引用与移动语义
按照这个定义来理解,“右值引用”就是对“右值”的引用了,而右值可能是常量,也可能是变量,那么右值引用自然也是分两种情况来不同处理。否则为什么不能这样呢?和const引用一样,常量没有地址,没有存储位置,只有值,因此,要把这个值保存下来的话,同样得按照“新定义变量”的形式,因此,当右值引用绑定常量时,相当于定义了一个普通变量。而根据规则,当用户没有定义拷贝构造的时候,C++会执行默认拷贝构造函数,进行浅拷贝(直接将原内容的地址交给要拷贝的类,两个类共同指向同一空间),这样执行上述代码,则会造成两次析构。
2023-09-04 17:11:27
517
原创 C++11 智能指针详解
C++程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员自己管理。程序员自己 管理堆内存可以提高了程序的效率,但是整体来说堆内存的管理是麻烦的,C++11中引入了智能指针的 概念,方便管理堆内存。C++里面的四个智能指针其中后三个是C++11支持,并且第一个已经被C++11弃用。一.shared_ptr共享被管理对象,同一时刻可以有多个shared_ptr拥有对象的所有权,当最后一个shared_ptr对象销毁时,被管理对象自动销毁。
2023-08-31 16:12:50
1765
2
原创 GIT使用
Windows系统Git安装教程(详解Git安装过程)Git视频教程1.使用流程(1) 使用默认路径创建本地仓库:git init查看当前仓库状态信息:git status(2) 将某个文件加入暂存区:git add <FILENAME> -- 红色文件就会变绿色将当前文件全部加入暂存区: git add .(3) 提交变更git commit -m <messa...
2022-03-28 16:57:38
859
4
原创 C语言操作符详解
左右移操作符:对于取模运算,只能是整数。 右移操作符:(1)算术右移:右边丢弃,左边补原符号位(正0 负1)---有符号(2)逻辑右移:右边丢弃,左边补0---无符号左移操作符:(1)左边丢弃,右边补位操作符:异或:相同为0,不同为1问题:不使用第三变量,交换两个值?定义临时变量使用加减法,可以解决某一部分问题,要避免数据溢出。使用异或: a = a^b b...
2022-03-08 14:27:39
791
1
原创 485&&Modbus协议
1.RS4851)485通信 --差分传输物理层: 通信引脚 A B使用双绞线通信。发送器: 逻辑1: A>B AB之间电压为+2V~+6V 逻辑0: A<B AB之间电压为-2V~-6V接收器: 逻辑1: A>B AB之间电压差不小于为200mV 逻辑0: A<B AB之间电压差小于200mV通信距离:负载:32个连接方式: SP3485 485是半双工通...
2021-08-29 11:04:03
16334
3
原创 两年嵌入式总结--面试
一.C语言二.单片机1.IIC总结1)IIC通信IIC是飞利浦公司研发两线制串行同步半双工通信总线,通信速度(100k,400k,3.4M)起始信号:SCL在高电平期间,SDA出现一个由高到低的跳变(SDA,SCL有最小保持时间 )停止信号:SCL在高电平期间,SDA出现由低变高的跳变(SDA,SCL有最小保持时间 )应答信号:SCL在高电平期间SDA始终处于低电平非应答信号:SCL在高电平期间SDA始终处于高电平应答/非应答产生于每个字节传输完毕后的下一个脉冲IIC2
2021-05-16 16:40:51
812
原创 视频监控项目--友善之臂---阿里云---QT---mjpg-streamer
1.ping开发板ip地址ping不通解决:关闭Linux 防火墙:ufw disable 关闭电脑防火墙:控制面板---系统安全 (记住杀毒软件也要关闭)linux开启ssh服务,实现ssh远程登录
2021-05-16 16:38:39
1397
3
原创 TCP与UDP区别与一些细节问题
1.UDP1). 乱序数据包是由在网络中传输并不是只在一条线路上,路由器动态智能选择不同的路径,这就会造成某些数据包虽然先发了,但是因为线路问题会慢于后发的数据包,造成乱序问题不管tcp还是udp都会乱序,但是tcp有算法纠正乱序(TCP首部会加序号)2). 丢包网络阻塞(路由器转发数据上限) 路由器性能不足 信号问题(不同距离路由器转发数据能力有所差异)TCP解决丢包问题:采用三次重传策略一次重传 2RTO(超时时间) 二次重传 4RTO 三次重传 8RTO3)..
2021-05-10 17:08:35
444
原创 STM32--软件IIC与硬件IIC驱动BH1750芯片
一.光照传感器分析查看芯片手册,总结GY_30使用注意的几个点:考虑断电通电、单次连续、读取数据时间1.设置芯片为通电模式、2.重置数字寄存器值3.设置连续 H分辨率模式4.等待一次测量时间max 180ms5完整过程发送起始信号,发送器件地址与读方向,检测应答。发送高分辨率指令,检测应答,发送结束信号 延时等待180ms 发送起始信号,发送器件地址与写方向,检测应答。接收高八位,检测应答。接收第八位,检测非应答,发送结束信号/**************
2021-04-25 18:45:16
1764
2
原创 STM32----IIC详解
一.IIC简介1.IIC总线概述IIC总线是飞利浦公司研发的两线制串行通信总线,IIC两线制包括:串行时钟线(SCL)和串行数据线(SDA)。串行时钟线(SCL)只能由主器件控制,串行数据线(SDA)实现双向数据传输(IIC通信属于同步、半双工串行通信)。IIC总线遵从主/从结构,可以实现一个主器件和多个从器件之间的通信,并且从器件永远不会主动给主器件发送数据。器件发送数据到总线上,则定义为发送器,器件从总线上读取数据,则定义为接收器(主器件和从器件都可以是发送器也可以是接收器)谁接收谁应答。2
2021-04-25 16:26:23
12310
6
原创 Linux驱动--字符设备开发
一.应用程序、内核、驱动的关系硬件设备收驱动程序(中断服务函数)控制。当用户调用一些API函数(库函数)会产生系统调用与内核产生关联,每一个API函数都会产生一个或多个系统调用,每个系统调用都会执行相应的SW指令,执行该指令相当于产生中断,中断进入中断服务函数,即驱动程序。如此:应用层就与硬件产生关联。简言之:系统调用时应用层与内核层接口,驱动程序是内核层与硬件层接口二.设备驱动分类1.字符设备LED、KEY、UART、SPI、IIC、RTC、LCD是一个顺序的数据流设备,对
2021-04-22 20:38:06
362
原创 Linux驱动--Linxu内核使用
一.Linux内核介绍1.内核介绍1)Linux内核基本概念Linux内核源码下载地址:https://www.kernel.org/Linux内核指的是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件。注:通常我们使用的Linux系统是一个集Linux内核、工具集、各种库、桌面管理器、应用程序等一体的一个发布包(发行版)。2)Linux核心功能进程管理、内存管理、设备管理、文件系统、网络协议3)Linux顶层目录介绍COPYING:版权信息CREDI.
2021-04-19 19:58:35
975
原创 Linux驱动--uboot启动流程
一.u-boot目录介绍主要在这三个文件夹做修改。 目 录 特 性 解 释 说 明 board 平台相关 存放开发板相关的目录文件,如 RPXlite(mpc8xx)、 smdk2410(arm920t)、sc520_cdp(x86) 等目录 arch 构架相关 存放了各种芯片构架相关的文件 a
2021-04-19 18:48:14
1218
原创 Linux驱动--uboot使用
一.一些概念1.BootLoaderBootLoader不属于操作系统,采用汇编语言和C开发2.BootLoader两种模式交互模式:命令接口API自启动模式:芯片上电后从固态固件加载操作系统到RAM。整个过程没有用户介入3.核内寄存器:CPU内部寄存器,没有地址只能通过汇编访问arm有37个寄存器,有ARM七种模式,包括系统模式(SYS)、管理模式(SVC)、用户模式、快速中断模式(FIQ)、普通中断模式(IRQ)、数据访问中只模式、未定义指令模式不论ARM处于那种工作
2021-04-15 20:38:13
597
原创 Linux驱动--裸机启动流程
采用Tiny4412一.基本概念1处理器CPU:中央处理器MCU:微处理器 (内部涵盖CPU,一些片内外设)MPU:微控制器(性能更强的微处理器)SOC:system on chip 片上系统(涵盖MCU(MPU)、外设、RAM ROM等---是一个系统)ARM基本上采用SOC架构2.两种结构哈弗结构:指令总线和数据总线分开分开(流水线处理)。指令存储在flash中,数据存储到RAM中。CPU从flash中取指令,从RAM中取数据MCU的指令和数据需求量都不大,配..
2021-04-14 20:40:01
1205
1
原创 C++继承
一.继承概念继承就是在原有成员基础上添加特有的成员形成派生类1.继承的作用目的:代码重用提高执行效率关键词:基类(父类)、派生类(子类)意义:子类拥有父类的成员、子类拥有父类没有的特性、子类是一种特殊的父类(子类可以当做父类使用)2.继承注意点不能继承父类的构造析构和友元函数 子类拥有父类所有成员属性和行为 一个类可以有多个基类,也可以有多个派生类3.继承派生类成员包括两大部分:一是从基类继承下来的成员(与基类拥有共同的特性)、二是本身独有的特性格式:clas
2021-04-01 19:46:45
1004
原创 C++多态
一.多态1.概念多态:同一操作(函数)作用不同对象,产生了不同的执行结果。本质:基类指针或引用指向派生类对象,来调用派生类方法,运行派生类的函数注意:在继承的时候虚函数进行了重写。重写要求函数名、函数类型、函数返回值一致。2.多态原理当对象成员行为用virtual修饰的时候,这个行为就会在前面添加一个ptr指针(虚函数指针 4字节)。该指针指向一个虚函数表,虚函数表存储当前对象所有虚函数的地址。在继承的时候虚函数指针总是放在第一位。3.存储结构 ①虚函...
2021-04-01 08:44:19
205
原创 构造与析构
一.构造函数构造函数就是对类对象进行初始化赋值。构造函数由编译器自动调用,且整个过程只调用一次。1.构造函数性质没有返回值也不写void 可以有参数和函数重载。 构造函数函数名与类名一致。 构造函数由编译器自动调用,且整个过程只调用一次。语法格式:#include<iostream>using namespace std;class A{public: A() { cout<<"构造函数A()"<<endl; } A(in
2021-03-28 14:38:47
2488
原创 类与对象
一.面向对象概念C语言:面向过程:机器人行走:考虑 左脚还是右脚 提起多少度 落脚 再迈右脚C++语言:面向对象语言:行走;人可以作为一个对象,属性姓名、年龄、身高、体重…行为有走、跑、跳、吃饭、唱歌…..具有相同性质的对象,我们可以抽象称为类,人属于人类,车属于车类;面向对象:把数据及对数据的操作方法放在一起,作为一个相互依存的整体。1.面向过程及面向对象优缺点面向过程:面向过程分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现按部就班,主要考虑性能,资源使用。不容易
2021-03-25 19:32:00
233
原创 初识C++
一.什么是C++C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计(本质面向对象,可以按照面向过程的方法使用c++),还可以进行以封装、继承和多态为特点的面向对象的程序设计。C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计,因而C++就适应的问题规模而论,大小由之。C++不仅拥有计算机高效运行的实用性特征,同时还致力于提高大规模程序的编程质量与程序设计语言的问题描述能力。二.五大区分析与作用域分析堆:就是那些由mall...
2021-03-24 16:22:15
315
1
原创 shell && 正则表达式
一.shell概述1.概述shell是一个用于用户和LInux系统之间交互的命令解释器shell有两种模式:交互式:用户输入一条命令,shell就解释执行一条。非交互式:用户事先写一个shell脚本,其中有很多条命令,让shell一次把这些命令执行完,而不是一条一条地敲命令2.使用方法vim xx.sh 在第一行输入#!/bin/bash //声明shell类型 bash shell,可以省略不写。 编写命令 保存退出 使用chmod 可执行权限 (可以bash xx.s.
2021-03-23 17:56:41
1297
原创 Mysql
一.Mysql安装数据库:用来存放表格的文件常见的数据库软件有很多,比如Oracle、MySQL、SQL Server、DB2、Sybase、SQLite……MySQL是众多数据库软件的一种,由MySQL AB 公司开发,目前属于 Oracle 旗下产品,MySQL 是最流行的关系型数据库管理系统之一。MySQL也是一款开源的SQL数据库管理系统,基于C/S模式,客户端与服务器通过网络连接交互数据。优点如下:1、性能卓越服务稳定,很少出现异常宕机。2、开放源代码且无版权制约,自主性强、使
2021-03-18 21:14:14
272
原创 FTP && SSH && NFS服务器安装使用
目录一.apt命令二.FTP服务器安装1.安装ftp服务器:2.windows与linux建立连接3.运行ftp服务器三.SSH服务器1.SSH协议介绍2.SSH服务器搭建3.SSH服务器相关命令4.SSH客户端的使用四.NFS服务器搭建和使用1.NFS协议介绍2.NFS服务器搭建3.NFS服务器相关命令4.Linux下挂载NFS一.apt命令apt-get update:更新软件列表信息(注意只是更新列表,并未更新程序,后接a..
2021-03-16 14:02:31
319
原创 IO多路复用之Select、Poll、Epoll详解
一.IO多路复用简介unxi有五种IO标准阻塞式IO 非阻塞式IO IO复用 信号驱动IO 异步IO当多种事件同时发生的时候阻塞IO:同一时刻只能处理一个事件,多事件使用多进程多线程,耗费内存资源。但是不必时间片轮训,节约CPU宝贵资源非阻塞IO:提高程序执行效率。不节约CPU资源。节约内存资源IO多路复用:select poll epoll二.什么是I/O多路转接技术构建一张文件描述符列表,将要监听的文件描述符添加至该列表。select poll epoll会一...
2021-03-11 20:51:26
1155
原创 嵌入式物联网协议--MQTT
一.MQTT简介1.什么是MQTTMQTT 是一个客户端服务端架构的发布/订阅模式的消息传输协议。 它的设计思想是轻巧、 开放、简单、 规范, 因此易于实现。这些特点使得它对很多场景来说都是很好的选择, 包括受限的环境如机器与机器的通信( M2M)以及物联网环境( IoT) , 这些场景要求很小的代码封装或者网络带宽非常昂贵。本协议运行在 TCP/IP,或其它提供了有序、可靠、 双向连接的网络连接上。 它有以下特点: 使用发布/订阅消息模式,提供了一对多的消息分发和应用之间的解耦。 消息
2021-03-03 20:15:15
4132
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人