- 博客(39)
- 收藏
- 关注
原创 C++11并发与多线程笔记(13)补充知识、线程池浅谈、数量谈、总结
文章目录1、补充知识1.1 虚假唤醒1.2 atomic2、浅谈线程池2.1 场景设想2.2 线程池2.3 实现方式3、谈线程池创建线程数量3.1 线程开的数量极限问题3.2 线程创建数量建议1、补充知识1.1 虚假唤醒notify_one或者notify_all唤醒wait()后,实际有些线程可能不满足唤醒的条件,就会造成虚假唤醒,可以在wait中再次进行判断解决虚假唤醒。解决:wait中要有第二个参数(lambda),并且这个lambda中要正确判断所处理的公共数据是否存在。1.2 ato
2021-11-06 11:04:20 284
原创 C++11并发与多线程笔记(12)windows临界区、其他各种mutex互斥量
文章目录1、Windows临界区1.1 创建Windows临界区1.2 临界区初始化1.3 进入临界区1.4 离开临界区1.5 示例代码2、多次进入临界区试验3、自动析构技术4、recursive_mutex5、带超时的互斥量std::timed_mutex和std::recursive_timed_mutex5.1 std::timed_mutex5.2 std::recursive_timed_mutex1、Windows临界区1.1 创建Windows临界区CRITICAL_SECTION 临
2021-11-06 11:03:46 647
原创 C++11并发与多线程笔记(11)atomic续谈、async深入谈
文章目录1、原子操作std::atomic续谈2、std::async深入谈2.1 std::async用来创建一个异步任务2.2 std::async和std::thread的区别2.3 std::async不确定性问题的解决1、原子操作std::atomic续谈一般atomic原子操作,针对++,--,+=,&=,|=,^=是支持的,其他的可能不支持。示例代码:#include <iostream>#include <thread>#include &
2021-11-06 11:03:07 305
原创 C++11并发与多线程笔记(10)future其他成员函数、shared_future、atomic
文章目录1、std::future的其他成员函数1.1 std::future_status1.2 wait_for()1.3 示例代码2、std::shared_future2.1 get_future()2.2 share()2.3 valid()2.4 示例代码:3、原子操作std::atomic3.1 原子操作概念引出范例3.2 基本的std::atomic用法范例1、std::future的其他成员函数1.1 std::future_status枚举类,用来表示future的返回状态/
2021-11-06 11:02:34 441
原创 C++11并发与多线程笔记(9)async、future、packaged_task、promise
文章目录1、std::async、std::future创建后台任务并返回值1.1 std::async1.2 std::future1.3 std::future::get()1.4 std::future::wait()1.5 使用普通函数创建异步任务1.6 使用类成员函数创建异步任务1.7 std::lanuch1.7.1 std::lanuch::deferred1.7.2 std::lanuch::async2、std::packaged_task3、std::promise4、小结1、std:
2021-11-06 11:01:53 666
原创 C++11并发与多线程笔记(8)condition_variable、wait、notify_one、notify_all
文章目录1、条件变量std::condition_variable、wait()、notify_one()1.1 前提1.2 std::condition_variable1.3 wait()1.4 notify_one()1.5 示例代码(不完美):2、notify_all()1、条件变量std::condition_variable、wait()、notify_one()1.1 前提线程A:等待一个条件满足线程B:专门往消息队列中扔消息(数据)1.2 std::condition_vari
2021-11-06 11:00:42 912
原创 C++11并发与多线程笔记(7)单例设计模式共享数据分析、解决,call_once
文章目录1、设计模式大概谈2、单例设计模式3、单例设计模式共享数据问题分析、解决4、std::call_once()1、设计模式大概谈设计模式代码的一些写法(这些写法跟常规写法不怎么一样),这样代码写出来的程序灵活,维护起来可能方便,但是别人接管,阅读代码非常痛苦。用“设计模式”理念写出来的代码是很晦涩的;当应付特别大的项目的时候,把项目的开发经验、模块划分经验,总结整理成设计模式(先有开发需求,后有理论总结和整理)。设计模式肯定有它独特的优点,要活学活用,不要深陷其中,生搬硬套。2、
2021-11-06 10:59:43 221
原创 C++11并发与多线程笔记(6)unique_lock详解
文章目录1、unique_lock取代lock_guard2、unique_lock第二个参数2.1 std::adopt_lock2.2 std::try_to_lock2.3 std::defer_lock3、unique_lock的成员函数3.1 lock(),unlock()3.2 try_lock())3.3 release()4、unique_lock所有权的传递4.1 std::move4.2 return std::unique_lock1、unique_lock取代lock_guard
2021-11-06 10:58:33 526
原创 C++11并发与多线程笔记(5)互斥量概念、用法、死锁演示及解决详解
文章目录1、互斥量的基本概念2、互斥量的用法2.1 lock(),unlock()2.2 std::lock_guard3、死锁3.1 死锁演示3.2 死锁的一般解决方案3.3 std::lock()函数模板3.4 std::lock_guard的std::adopt_lock参数3.5 总结1、互斥量的基本概念 当对共享数据进行操作时,为了防止线程冲突,我们应该使某个线程用代码把共享数据锁住,然后操作数据,最后解锁;其他线程想操作共享数据的线程必须等待解锁,锁定住,操作,解锁。这就引出了一个名词概
2021-11-01 21:59:38 313 1
原创 C++11并发与多线程笔记(4)创建多个线程、数据共享问题解析、案例代码
文章目录1、创建和等待多个线程1.1 范例1.2 总结2、数据共享问题分析2.1 只读的数据2.2 有读有写的数据2.3 其他案例3、共享数据的保护案例代码1、创建和等待多个线程1.1 范例#include <iostream>#include <thread>#include <vector>using namespace std;void myprint(int inum){ cout << "myprint线程开始执行了,线程编号="
2021-11-01 21:51:57 418
原创 C++11并发与多线程笔记(3)线程传参详解,detach()大坑,成员函数做线程函数
文章目录1、传递临时参数作为线程参数1.1、要避免的陷阱(解释1)1.2、要避免的陷阱(解释2)1.3、总结2、临时对象作为线程参数的测试方法2.1 线程id2.2 临时对象构造时机抓捕3、传递类对象、智能指针作为线程参数3.1 传递类对象3.2 std:ref()3.3 传递智能指针3.4 用成员函数指针做线程函数3.5 对传递类对象进行改造3.6 总结1、传递临时参数作为线程参数1.1、要避免的陷阱(解释1)示例代码:#include <iostream>#include <
2021-10-30 16:58:48 507
原创 C++11并发与多线程笔记(2)线程启动、结束,创建线程多法、join,detach
文章目录1、线程创建方法及案例1.1 范例1.2 thread1.3 join()1.4 detach()1.5 joinable()2、其他创建线程的手法2.1 、用类对象2.2、 用lambda表达式1、线程创建方法及案例程序运行起来,生成一个进程,该进程所属的主线程开始自动运行;当主线程从main()函数返回,则整个进程执行完毕。主线程从main()开始执行,那么我们自己创建的线程,也需要从一个函数开始运行(初始函数),一旦这个函数运行完毕,线程也结束运行。整个进程是否执行完毕的标志是:主线
2021-10-30 16:57:31 275
原创 C++11并发与多线程笔记(1)并发基本概念及实现,进程、线程基本概念
文章目录1、并发、进程、线程的基本概念和综述1.1 并发1.2 可执行程序1.3 进程1.4 线程1.5 总结1.6 学习心得2、并发的实现方法2.1 多进程并发2.2 多线程并发2.3 总结3、C++11新标准线程库3.1 以往3.2 C++11以后3.2 C++11以后1、并发、进程、线程的基本概念和综述1.1 并发两个或者更多的任务(独立的活动)同时发生(进行):一个程序同时执行多个独立的任务;以往计算机,单核CPU(中央处理器):某一个时刻只能执行一个任务,由操作系统调度,每秒钟进行多次所
2021-10-30 16:55:13 209
原创 VS2019C++编译GDAL3.3.2+SQLite3+PROJ6+GEOS3.7.3+HDF4+HDF5(保姆级教程)
VS2019C++编译GDAL3.3.2+SQLite3+PROJ6+GEOS3.7.3+HDF4+HDF5文章目录VS2019C++编译GDAL3.3.2+SQLite3+PROJ6+GEOS3.7.3+HDF4+HDF5前言:1、准备1.1下载1.1.1下载库1.1.2工具下载2、编译2.1 静态编译SQLite库2.1.1 解压2.1.2 创建静态库工程2.2、编译PROJ62.2.1 解压2.2.2 编译PROJ62.3 编译GEOS库2.3.1 修改`nmake.opt`文件2.3.2 进行
2021-10-20 19:00:34 3306 14
转载 Linux常用的基本命令
常用的基本命令目录管理绝对路径和相对路径我们知道Linux的目录结构为树状结构,最顶级的目录为根目录 /。其他目录通过挂载可以将它们添加到树中,通过解除挂载可以移除它们。在开始本教程前我们需要先知道什么是绝对路径与相对路径。绝对路径:路径的写法,由根目录 / 写起,例如:/usr/share/doc 这个目录。相对路径:路径的写法,不是由 / 写起,例如由 /usr/share/doc 要到 /usr/share/man 底下时,可以写成:cd …/man 这就是相对路径的写法啦!处理目
2021-08-11 18:47:41 355
转载 Linux环境配置
环境配置jdk安装(rpm安装)1、rpm下载地址http://www.oracle.com/technetwork/java/javase/downloads/index.html2、如果有安装openjdk 则卸载[root@kuangshen ~]# java -versionjava version "1.8.0_121"Java(TM) SE Runtime Environment (build 1.8.0_121-b13)Java HotSpot(TM) 64-Bit Server
2021-08-11 18:40:28 96
转载 Linux开机关机和基本目录介绍
走进Linux系统开机登录开机会启动许多程序。它们在Windows叫做"服务"(service),在Linux就叫做"守护进程"(daemon)。开机成功后,它会显示一个文本登录界面,这个界面就是我们经常看到的登录界面,在这个登录界面中会提示用户输入用户名,而用户输入的用户将作为参数传给login程序来验证用户的身份,密码是不显示的,输完回车即可!一般来说,用户的登录方式有三种:命令行登录ssh登录图形界面登录最高权限账户为 root,可以操作一切!关机在linux领域内大多用在服务
2021-08-11 18:39:09 251
转载 MySQL基础
初识MySQL为什么学习数据库1、岗位技能需求2、现在的世界,得数据者得天下3、存储数据的方法4、程序,网站中,大量数据如何长久保存?5、数据库是几乎软件体系中最核心的一个存在。什么是数据库数据库 ( DataBase , 简称DB )概念 : 长期存放在计算机内,有组织,可共享的大量数据的集合,是一个数据 “仓库”作用 : 保存,并能安全管理数据(如:增删改查等),减少冗余…数据库总览 :关系型数据库 ( SQL )MySQL , Oracle , SQL Server
2021-08-11 18:34:34 234
原创 Java_注解和反射
注解什么是注解?Annotation是从JDK5.0开始引入的新技术Annotation的作用不是程序本身,可以对程序作出解释。(这一点和注释(comment)没什么区别)可以被其他程序(比如∶编译器等)读取。Annotation的格式注解是以"@注释名"在代码中存在的,还可以添加一些参数值,例如:@Suppresswarnings(value=“unchecked”)。Annotation在哪里使用?可以附加在 package, class, meth
2021-08-11 18:25:43 151
原创 Java_多线程
1. 线程简介普通法方法调用和多线程Process和Thread说起进程,就不得不说下程序。程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。而进程则是执行程序的一次执行过程,它是一个动态的概念。是系统资源分配的单位通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义。线程是CPU调度和执行的的单位。注意:很多多线程是模拟出来的,真正的多线程是指有多个cpu,即多核,如服务器。如果是模拟出来的多线程,即在一个cpu的情况下,在同一个时间
2021-08-11 18:19:25 150
转载 Java_IO流
流的概念概念:内存与存储设备之间传输数据的通道。水借助管道传输;数据借助流传输。流的分类按方向【重点】输入流:将<存储设备>中的内容读入到<内存>中。输出流:将<内存>中的内容写入到<存储设备>中。按单位字节流:以字节为单位,可以读写所有数据。字符流:以字符为单位,只能读写文本数据。按功能节点流:具有实际传输数据的读写功能。过滤流:在节点流的基础之上增强功能。字节流字节流的父类(抽象类)InputSt
2021-08-11 18:10:12 83
转载 Java_集合框架
集合概念:对象的容器,定义了对多个对象进行操作的常用方法。可实现数组的功能。和数组区别:(1)数组长度固定,集合长度不固定。(2)数组可以存储基本类型和引用类型,集合只能存储引用类型。位置:java.util.*;Collection体系集合Collection父接口特点:代表一组任意类型的对象,无序、无下标、不能重复。方法:boolean add(Object obj) //添加一个对象。boolean addAll(Collection c) //将
2021-08-11 18:05:54 101
原创 Java_常用类
内部类概念:在一个类的内部再定义一个完整的类。特点:编译之后可生成独立的字节码文件。内部类可直接访问外部类的私有成员,而不破坏封装。可为外部类提供必要的内部功能组件。成员内部类在类的内部定义,与实例变量、实例方法同级别的类。外部类的一个实例部分,创建内部类对象时,必须依赖外部类对象。Outer outer = new Outer();Outer.Inner inner = outer.new Inner();当外部类、内部类存在重名属性时吗,会优先访问内
2021-07-17 17:00:06 267
原创 Java_异常
异常什么是异常?实际工作中,遇到的情况不可能是非常完美的。比如:你写的某个模块,用户输入不ー定符合你的要求、你的程序要打开某个文件,这个文件可能不存在或者文件格式不对,你要读取数据库的数据,数据可能是空的等。我们的程序再跑着,内存或硬盘可能满了。等等。软件程序在运行过程中,非常可能遇到刚刚提到的这些异常向题,我们叫异常,英文是:Exception,意思是例外。这些,例外情況,或者叫异常,怎么让我们写的程序做出合理的处理。而不至于程序崩溃。异常指程序运行中出现的不期而至的各种状况如:文件找不到、网络
2021-07-01 17:13:26 86
原创 Java_面向对象
OOP简介面向对象编程( Object-Oriented Programming,OOP)面向对象编程的本质就是:以类的方式组织代码,以对象的组织(封装)数据。抽象三大特性:封装继承多态从认识论角度考虑是先有对象后有类。对象,是具体的事物。类,是抽象的,是对对象的抽象。从代码运行角度考虑是先有类后有对象。类是对象的模板。创建与初始化对象使用new关键字创建对象。使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的对象进行默认的初始化以及
2021-07-01 17:11:25 91
原创 Java_数组
数组定义数组是相同类型数据的有序集合。数组描述的是相同类型的若干个数据按照一定的先后次序排列组合而成。其中每一个数据称作ー个数组元素每个数组元素可以通过一个下标来访向它们。数组的声明和创建首先必须声明数组变量,才能在程序中使用数组。下面是声明数组变量的语法:dataType[] arrayRefVar; //首选的方法或dataType arrayRefVar[]; //效果相同,但不是首选方法Java语言使用new操作符来创建数组,语法如下:dataType[] arr
2021-06-26 09:53:26 82
原创 Java_方法
方法System.out.println()System是类,out是对象,println是方法Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类向题的步骤的有序组合。方法包含于类或对象中。方法在程序中被创建,在其他地方被引用。设计方法的原则:方法的本意是功能块,就是实现某个功能的语句块的集合。我们设计方法的时候,最好保持方法的原子性,就是一个方法只完成1个功能,这样利于我们后期的扩展。package com.jack.method;public
2021-06-26 09:49:11 79
原创 Java_流程控制
流程控制顺序结构Java的基本结构就是顺序结构,除非特别指明,否则就按照顺序一句一句执行。顺序结构就是最简单的算法结构语句与语句之间,框与框之间是按从上到下的顺序进行的,它是由若干个依次执行的处理步骤组成的,它是任何一个算法都离不开的一种基本算法结构。package com.jack.struct;public class ShunXuDemo { public static void main(String[] args) { System.out.pri
2021-06-24 18:12:54 77
原创 Java_用户交互Scanner
Scannner对象之前我们学的基本语法中我们并没有实现程序和人的交互,但是Java给我们提供了这样一个工具类,我们可以获取用户的输入。java.util.Scanner是Java5的新特征,我们可以通过Scanner类来获取用户的输入。基本语法:Scanner s = new Scanner(System.in);通过 Scanner类的next( )与 nextline( )方法获取输入的字符串,在读取前我们一般需要使用 hasNext( ) 与 hasNextLine( )判断
2021-06-24 17:59:53 70
原创 Java_包机制
包机制为了更好地组织类,Java提供了包机制,用于区别类名的命名空间。包语句的语法格式为:package pkg1[.pkg2[.pkg3...]];一般利用公司域名倒置作为包名。www.baidu.com --> com.baidu.www为了能够使用某一个包的成员,我们需要在Java程序中明确导入该包。使用“import”语句可完成此功能。星号*为通配符,指导入包内所有类。import package1[.package2].(classname|*);i
2021-06-24 17:58:08 76
原创 JavaDoc生成文档
JavaDoc生成文档简介javadoc命令是用来生成自己API文档的参数信息@ author 作者名@ version 版本号@ since 指明需要最早使用的jdk版本@ param 参数名@ return 返回值情况@ throws 异常抛出情况package com.jack.base;/** * @author Jack丶wang * @version 1.0 * @since 1.8 */public class Doc { String n
2021-06-19 22:35:26 129
原创 Java_运算符
运算符简介Java语言支持如下运算符:算数运算符:+,-,*,/,%,++,–赋值运算符:=关系运算符:>,<,>=,<=,==,!=instanceof逻辑运算符:&&,||,!位运算符:&,|,^,~,>>,<<,>>>(了解!!!)扩展运算符:+=,-=,*=,/=**注意:**byte、short、char用运算符运算后自动转型为int类型算术运算符、赋值运算符、关系运算符public
2021-06-19 21:34:26 90
原创 Java_变量、常量、作用域
变量简介变量是什么:就是可以变化的量!Java是一种强类型语言,每个变量都必须声明其类型。Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。type varName [=value] [{,varName}[=value]}]://数据类型 变量名 = 值;可以使用逗号隔开来声明多个同类型变量。注意事项:每个变量都有类型,类型可以是基本类型,也可以是引用类型。变量名必须是合法的标识符。变量声明是一条完整的语句,因此每一个声明都必须以分号结束。
2021-06-19 18:47:17 97
原创 Java_数据类型
数据类型强类型语言要求变量的使用要严格符合规定,所有变量都必须先定义后才能使用。Java的数据类型分为两大类基本类型(primitive type)引用类型(reference type)#mermaid-svg-O1FNoRrojIowY9z6 .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg
2021-06-16 15:10:41 154
原创 Java_标识符和关键字
关键字protected一种访问控制方式:保护模式public一种访问控制方式:共用模式abstract表明类或者成员方法具有抽象属性class类extends表明一个类型是另一个类型的子类型,这里常见的类型有类和接口final用来说明最终属性,表明一个类不能派生出子类,或者成员方法不能被覆盖,或者成员域的值不能被改变implements表明一个类实现了给定的接口interface接口native用来声明一个方法是由与计算机相关
2021-06-16 15:07:57 70
原创 Java_注释
注释单行注释只能注释一行文字// + 注释内容//这是单行注释多行注释可以注释一段文字/* + 注释内容 + *//*我是多行注释我是多行注释我是多行注释*/文档注释/** 开头,*/ 结尾,中间 * +注释内容/** * @Description HelloWorld * @Author wang */...
2021-06-16 15:06:28 63
原创 Java第一个程序HelloWorld学习
HelloWorld1.随便新建一个文件夹,存放代码2.新建一个java文件文件后缀名为.javaHello.java【注意点】系统可能没有显示文件后缀名,我们需要手动打开3.编写代码public class Hello{ public static void main(String[] args){ System.out.print("Hello,World!"); }}4.编译javac java文件,会生成一个class文件5.运行一个class文件,java cl
2021-06-15 13:55:16 1281 2
原创 DOS简单常用命令学习
DOS命令1. 打开cmd的方式开始 >>> 系统 >>> 命令提示符win键 + R ,输入cmd打开控制台(推荐使用)在任意文件夹下面,按住shift键 + 鼠标右键点击,在此处打开命令行窗口资源管理器的地址栏前面加上 cmd 路径2. 常用的Dos命令# 盘符切换 >>> 盘符名称 + “:” 例:E:# 查看当前目录下的所有文件 >>> dir# 切换目录 >>> cd + /d + 目录
2021-06-15 13:52:56 130
原创 Markdown基础学习
Markdown学习1. 标题“# + 空格 + 标题名字”:一级标题“## + 空格 + 标题名字”:二级标题“### + 空格 + 标题名字”:三级标题以此类推,最高六级标题2. 字体2.1 加粗字体前后各加 “**”例:Hello,World! >>> Hello,World2.2 斜体字体前后各加 “*”例:Hello,World! >>> Hello,World2.3 斜体加粗字体前后各加 “***”例:Hello,
2021-06-15 13:50:49 80
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人