- 博客(19)
- 收藏
- 关注
原创 spring boot修改使用jar包依赖版本号
在项目的父pom文件里可以看到<parent>标签里面定义的spring boot管理版本号的地方,进到spring boot dependencies里面,可以看到各个依赖的版本号。找到需要修改的jar包对应定义版本的key值,比如mysql的为<mysql.version>8.0.18</mysql.version>。在父项目的pom文件里增加<properties>修改这里的版本。由于maven是就近原则,所以这里我们配置的版本号会覆盖掉原来spring
2021-06-21 16:28:15
1904
原创 excel将字段自动转化为科学计数法解决方案
excel有个比较蛋疼的功能,就是你超过11位的数字会自动被转换为科学计数法表示,但有时候我们只希望以文本显示(比如一个订单号,变成科学计数法就没法看了),这时候如果是用代码生成的csv文件,可以在字段结尾加上一个不可见字符,比如"\t",这样就能阻止excel的自动转换...
2021-04-15 15:20:33
1373
原创 c++静态链接以及动态链接的区别
在linux系统里,静态链接(.a)文件是通过将被链接的库文件拷贝一份的方法,提供给应用程序使用的。应用程序在编译的时候,静态库的源文件会被拷贝一份放到应用程序里,因此如果库升级之后,需要将应用程序重新编译。同时如果多个应用程序使用同一个静态库,那么内存中会存在这个静态库文件的多个副本。动态链接(.so)文件是将库文件直接放到内存中,如果应用程序需要使用,到执行的时候才会去内存中读取动态库文件,如果库升级之后,应用程序无需重新编译,会直接切换到动态库最新的版本。在两种连接方式的选择方面,如果从节省内
2021-04-02 11:17:33
504
原创 linux内存分配(mmu)以及fork之后父子进程读时共享,写时复制
linux给应用程序首先分配的是虚拟内存,然后再通过 mmu(Memory Management Unit)将虚拟内存映射到物理内存。这样的好处是每一个进程都可以使用4G内存空间(0-3用户态,3-4内核态)。使用fork产生的父子进程读时共享,写时复制。比如在父进程内原来有一个全局变量,如果fork之后父子进程都没有去改变这个变量的值,那么内存中全局区这个变量只会存在一份,所谓读时共享;但是如果fork后父进程或者子进程改变了这个变量的值,那么这个变量将会在内存全局区存在两份,父子进程各自拥有各自的副
2020-06-29 10:56:25
1270
原创 C++ 自己代码实现一个递归锁recursive_mutex
之前看过一篇博客讲递归锁的实现,博客链接https://blog.youkuaiyun.com/m18718300471/article/details/79927948但是我测试发现博客中的递归锁实现有问题,因此自己写了一种实现,不一定是最好的,如果有人发现问题或者有更好的写法,欢迎指出来,大家一起讨论交流~递归锁介绍我们都知道,一般的互斥量对于同一个线程只能同时加锁一次(调用lock),如果连续调用两次以上便会出现死锁。你可能会问,为什么会连续调用两次呢,但设想这样一个场景,如果在一个函数内给互斥量上了
2020-06-24 17:17:22
2099
2
原创 C++ thread学习四(使用async创建线程并返回结果)
使用async创建一个新线程,返回一个future类型的对象,可以使用这种方法从线程中返回值。基本语法为:std::future<线程函数返回值类型> res = std::async(标记, 线程入口函数);标记常用的有std::launch::deferred和std::launch::async。std::launch::async:为系统默认缺省参数(如果不加标记,系统默认会加上这个),意思是为当执行此行语句时线程被创建并开始执行,但是如果此线程没有被执行完,会被阻塞在res
2020-06-21 10:11:26
1010
原创 C++ Thread学习四 (使用条件变量condition_variable来实现生产者消费者)
仍然接着我的上一篇博客里的内容https://blog.youkuaiyun.com/mcc12356/article/details/106825972(感兴趣可以去看看),主要是一个写线程往共享队列里写数据,另一个读线程从队列里读数据。当时使用了mutex来实现了对共享队列的保护,但是那里会有一点问题,如果共享队列为空,读队列线程读取不到数据,但仍然可能获取了锁导致写线程被阻塞。那么能否有一种方法使得读线程只有在队列不为空时才能获取锁呢?这时条件变量(condition_variable)就派上了用场。条件变量
2020-06-20 17:28:37
557
原创 C++ 实现一个线程安全的单例模式
首先简单介绍一下单例模式。顾名思义,单例模式就是一个类只允许建一个对象,在实际工程中经常会用到。比如一些配置文件的类,多个对象没有意义且浪费资源,所以这时候就可以使用单例模式去实现。C++实现单例模式最简单的方法就是让一个类构造函数私有化,并且内部提供一个公有接口,每当有需要获取这个类的对象的时候就调用此公有接口,返回这个类的对象。代码如下:class Singleton{private: Singleton(){} private: // 此类唯一对象
2020-06-19 18:11:43
487
原创 c++ 类静态成员初始化
类静态成员是被该类所有对象共享的数据,必须在类外初始化。(如果在类内初始化的话则每个对象都会去初始化该成员,因此会报错)。class A{public: // static int a = 0; //错误写法 static int a;};int B::a = 0;如果是静态常量成员则两种写法都可以。(因为常量只会被初始化一次)class A{public: static const int a = 0;};...
2020-06-19 10:47:18
364
原创 C++ thread学习三 (使用互斥量mutex处理共享数据)
前面我们每个线程只是各自处理各自的数据,或者对于共享数据多个线程只有读操作,并没有写操作,因此不存在任何问题。但是如果线程A,B对同一块内存进行操作,线程A读数据,线程B写数据,如果A读数据前想要的数据还没来得及读,由于cpu时间片切换,B往内存里写了个新数据覆盖掉原来的数据,那么就会出现错误。为了解决这个问题,最简单的办法就是给这块共享内存加上锁,一次只允许一个线程对这块内存进行操作。为了模拟这个问题,创建一个list,其中一个线程不断往这个list里添加数据,另一个线程从该list里读取数据,代
2020-06-18 11:37:18
373
原创 c语言数组形参
在c语言中,如果数组作为参数传递,会退化为指针。void testPara(int nums[]){ int len = sizeof(nums) / sizeof(int); printf("形参数组长度为%d\n", len);}int main(){ int nums[] = {1,2,3,4,5}; int len = sizeof(nums) / sizeof(int); printf("实参数组长度为%d\n", len); test
2020-06-16 19:57:47
2527
原创 select I/O复用实现简单web服务器
简单web服务器模型要想实现一个简单的web服务器模型,一般有以下几种方法:1. 多进程(主进程监听,有新的连接就fork一个子进程建立连接)2. 多线程(主线程监听,有新的连接就新建一个子线程建立连接)3. 使用系统函数select去监听,当有文件描述符就绪对其进行处理4. 使用系统函数poll去监听,当有文件描述符就绪对其进行处理5. 使用系统函数epoll去监听,当有文件描述符就绪对其进行处理3,4,5都是单线程,基本原理就是有一个线程在监听是否有新的客户端请求,如果有的话
2020-06-12 10:19:50
389
原创 C++ thread学习二(一些避免出现的坑)
1. 如果要main thread使用detach方法,尽量不传递引用,一定不能传递指针。#include <iostream>using namespace std;#include "thread"#include <unistd.h>//此时ref虽然是引用,却是值传递,因此即使main thread用的detach并且回收了变量ref内存,不会影响thread里ref的值//此时pointer是地址传递m,因此如果如果main thread 提前退出,会将po
2020-06-02 21:18:39
478
原创 C++ thread学习一(利用C++11 thread创建线程)
之前几次学习多线程但都没有学到最后,今天重启C++多线程学习计划,希望可以坚持到最后。首先简单介绍一下进程以及线程。进程是系统资源分配的最小单位,线程是cpu执行的最小单位。简单来说,一个可执行程序运行起来就是一个进程,一个进程可能包含多个线程,一个进程一定有一个主线程,就相当于main函数,是程序的入口。1. 创建一个线程#include <iostream>using namespace std;#include "thread"void threadTest(){
2020-06-01 17:08:51
1319
原创 mac配置CGI运行程序以及自己踩得坑
CGI(Common Gateway Interface),通用网关接口,它是一段程序,运行在服务器上如:HTTP服务器,提供同客户端HTML页面的接口。mac自带apache server和CGI运行程序,本文将使用自带的apache server和CGI运行程序。mac 启动apache server:sudo apachectl start/restart #启动sudo apachectl stop #停止默认CGI不可用,需要进行相应修改。1.打开httpd.conf文件,..
2020-05-30 18:06:39
843
1
原创 go 数组总结
不同大小数组为不同类型,不可互相赋值var a= [2]int {1,2}var b [3]intb = a // wrong, a and b are different type数组传递是值类型,而不是引用。传递数组时会传递一份值得副本,对副本进行改动原数组并不会发生改变var a= [2]int {1,2}b := a // copy a and assign to bb[0] = 3//此时a = [1,2], b = [3, 2]多维数组a := [2]..
2020-05-25 09:13:04
314
原创 go语言package简单理解
go语言每一个文件夹都是一个单独的package,一个project里有且仅有一个main package,main package里有一个main function,这是程序执行的入口。main package里的东西其他package不可调用,其他package里的变量如需要调用可用package_name.func()或package_name.variable调用。此时func和variable必须以大写字母开头,表示公有。以小写字母开头表示私有,只能在同一个package下面调用。...
2020-05-22 16:24:42
336
原创 美国cs master两年总结以及毕业回国
2020年5月21日 武汉这是我第一篇博客,以前一直说开始写但都没有付诸行动,不知不觉美国master毕业了,想写一写自己的感悟以及经历。两年前,怀揣着对未来生活的忐忑,我一个人坐上了飞机,从上海浦东出发,踏上了赴美求学之路。刚来一切都是那么陌生,学习方面一下子变成全英文还是有些吃力,生活上一切靠自己,尤其是做饭(在国内几乎没有碰过炉灶的那种),不过所幸两年下来厨艺突飞猛进,不敢自称大厨,倒是可以负担起家庭炒菜的重任。渐渐的我发现周围的朋友都是以找工作为目的,确实是这样,美国的master基本.
2020-05-21 12:09:26
2393
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅