自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(33)
  • 收藏
  • 关注

原创 C++使用thread_local实现每个线程下的单例

对于一个类,想要在每个线程种有且只有一个实例对象,且线程之间不共享该实例,可以按照单例模式的写法,同时使用C++11提供的thread_local关键字实现。由于使用了智能指针定义对象,智能指针不能自动调用private析构函数,因此需要自定义一个public函数destory(A* ptr)作为智能指针的删除器。在单例模式的基础上,使用thread_local关键字修饰单例的instance,保证该静态成员在一个线程创建时创建单独的副本。可以看到,每个线程中构造了单独的A::instance。

2024-06-09 19:32:24 294

原创 Qt信号槽与函数直接调用性能对比

定义一个类Recv,其中包含一个成员变量num和一个成员函数add(),add()实现num的递增。单独开一个线程Watcher,每秒计算num变量的增长数值,作为add函数被调用的次数。另一个类Send通过信号槽或直接调用的方法调用Recv的add函数。信号槽相比函数直接调用慢60倍。

2024-06-05 22:09:30 491

原创 实现支持多选的QComboBox

QLineEidt是框中显示的内容,QListWidget是下拉列表。比如最基本的:将当前选中的内容添加到显示框中。Qt提供的QComboBox只支持下拉列表内容的单选,但通过QComboBox提供的setModel、setView、setLineEdit三个方法,可以对QComboBox进行改造,使其实现下拉列表选项的多选。对于我们重新定义的QListWidget,其中包含的每一条内容应该是一个QCheckBox,因此重写QComboBox中的addItem方法,将传入的字符串包装为QCheckBox。

2024-03-11 22:31:47 1548

原创 Qt跨线程的槽函数执行

在Qt::QueuedConnection连接模式下,跨线程的槽函数调用会按照信号发送顺序执行。槽函数执行过程中不会被中断,槽函数执行完毕后再次开始事件循环,继续执行下一次的槽函数。来不及执行的信号和参数会被框架“保存”起来。

2023-12-21 21:07:00 955

原创 Linux socket编程(二):多进程服务器

子进程复制父进程的资源,因此fork()创建子进程时复制了connfd和listenfd,这两个socket文件的引用计数+1,在子进程中不需要listenfd,直接关闭,这个操作不会影响父进程中的listenfd,因为这时listenfd对应的socket文件的引用计数继续保持为1,socket不会关闭。同理,父进程中也不需要connfd,可以直接关闭。要想同时与多个客户端建立连接并处理请求,可以为每个连接的客户端创建一个子进程,在子进程中接受/发送客户端的数据,各个子进程之间互不干扰。

2023-04-25 19:21:14 621

原创 latex编译的pdf书签中不能显示公式

在latex的标题(\section)中输入数学公式,并用宏包hyperref提取目录,编译得到的pdf的书签中不能正确显示公式。

2023-03-02 20:58:03 945

原创 Linux socket编程(一):客户端服务端通信、解决TCP粘包

一、服务端程序服务端程序工作流程: 创建socket →\rightarrow→ 绑定监听的IP地址和端口 →\rightarrow→ 监听客户端连接 →\rightarrow→ 接受/发送数据。对应到系统API的调用就是socket() →\rightarrow→ bind() →\rightarrow→ listen() →\rightarrow→ accept() →\rightarrow→ recv()/send()socket()创建socket,返回一个文件描述符,这个文件描述符只用于监听客

2022-04-28 19:28:46 1925 1

原创 MIT6.824 Lab3实现与踩坑

Lab3要在Lab2的Raft层之上实现一个key-value存储系统,实现数据的多副本存储,要求满足线性一致性。理论上来说,Raft只能保证共识,即保证各个节点的log是相同的,这与系统的一致性无关。系统是否满足线性一致性取决于上层应用的实现方式。对于本实验来说,要想满足线性一致性,就要求无论是读请求还是写请求,都需要在Raft层提交之后才在KVServer上执行。Lab3并不像Lab2一样按照一篇论文来实现,需要自己设计。但其实这个系统的实现思路基本就一种,没有太多自己发挥的空间。我看了网上的其它博客

2022-01-20 18:31:25 4399

原创 MIT6.824 Lab2实现与踩坑

Lab2要求实现Raft协议,最主要的就是实现两个RPC方法——RequestVote和AppendEntries,每个RPC方法的参数、返回值和处理流程要完全按照论文来实现,同时要参考课程给出的Raft Structure Advice和Student Guide。下面对论文中的一些细节和go语言的实现细节做一些记录一、Lab2ALab2A只需要实现leader election这一个功能,测试也只有两个,但也是整个Lab2,3,4的开始,所以并不简单currentTerm和votedFor的改变:

2022-01-19 00:21:54 2270 1

原创 为什么golang不能在函数中对slice执行append操作

一般认为,golang中的slice是引用传递,即向函数传入slice变量的地址,因此可以在函数中修改slice中变量的值func main() { arr := make([]int, 3) for i := range arr { arr[i] = i } changeArr(arr) fmt.Println(arr)}func changeArr(arr []int) { arr[0] = 100}输出:[100,1,2],结果正确然而在函数中调用append函数,并不

2021-12-14 23:36:35 588

原创 go语言time.Add()方法使用变量作为参数报错:Cannot use xxx(type int) as the type Duration

在使用time.Add()方法时,可以直接传入一个整数作为参数,如:func main() { t := time.Now() fmt.Println(t) t = t.Add(10 * time.Millisecond) fmt.Println(t)}注意time.Add()方法会返回修改之后的时间,而不是直接在接收器上进行修改。当想要用一个变量作为time.Add()方法的参数时,直接传入会报错:func main() { t := time.Now() fmt.Println(

2021-11-15 21:14:01 4905

原创 Java有缓冲与无缓冲读写效率对比

将1~100000整数写入(读取)out.txt文件中,记录不同写入方式的运行时间一、无缓冲写public class Main { public static void main(String[] args) throws Exception { FileOutputStream fos = new FileOutputStream("D:\\out.txt"); long start = System.currentTimeMillis();

2021-08-18 19:28:05 354 1

原创 Java集合框架源码阅读——ConcurrentHashMap

一、Map的初始化与扩容map初始化的方法为initTable(),使用CAS方法保证只有一个线程来对map初始化。最外层的while循环判断map是否仍未空,不为空说明已经有线程完成初始化了,直接返回。之后再根据sizeCtl的值判断当前是否有线程正在初始化。sizeCtl是一个成员变量,可能出现三种情况:> 0,说明map没有正在初始化或扩容,这时的值表示map的容量阈值 == -1,说明map正在进行初始化 < -1,说明map正在进行扩容,值为-(1 + 正在扩容的线程数

2021-08-12 20:06:04 148

原创 size_t与int进行比较时的陷阱

执行下面的代码:int main(){ vector<int> a = { 1,2,3 }; int max_len = -1; if (a.size() > max_len) max_len = a.size(); printf("%d", max_len); return 0;}最终输出的max_len仍未-1,因为a.size()返回的是size_t类型,可以看作是unsigned int类型,根据类型自动转换规则,在i

2021-07-08 11:04:47 1722

原创 Java源码阅读——HashMap

HashMap和HashTable的区别:不是线程安全的。HashTable中每个方法加上了synchronized来保证线程安全key和value允许空值(null值),HashTable不允许一、类变量DEFAULT_INITIAL_CAPACITY = 16,初始容量,可以在构造方法中指定。容量指哈希表中bin的个数,而不是保存元素的个数MAXIMUM_CAPACITY = 2302^{30}230,最大容量DEFAULT_LOAD_FACTOR = 0.75,负载因子,可以在构造方

2021-06-24 21:16:05 103

原创 pdf图片格式转eps格式

下载并安装ghostscript在系统环境变量path中添加ghostscript安装目录下的bin目录在命令行中执行gswin64c -sDEVICE=eps2write -dEPScrop -o "output.eps" "input.pdf"

2021-06-19 15:52:20 656

原创 JVM中的字节码文件常量池、运行时常量池、字符串常量池分别是什么

字节码常量池: 在class文件中,很大一部分就是常量池,其中主要包含字面量和符号引用。字面量是指源代码中出现的变量名、类名(全限定名)、方法名、为变量赋值用的数字和字符串。比如下面一段代码class Solution { public static int a = 10; public final double b = 20; private int c; protected int d; public final static String e; sta

2021-05-20 21:03:04 412 1

原创 Java多线程修改数据

问题定义: 定义一个类Number,其中包括变量num。多个线程对num进行读取和减1的操作。一、不安全的实现将num定义成静态变量:public class Number { public static int num = 30; public static AtomicInteger cnt = new AtomicInteger(0);}为了更好地看出线程多num的操作是否正确,用cnt来记录对num修改的次数,每有一个线程对num减去了1,就将cnt+1。cnt是Atom

2021-01-24 21:19:13 2540

原创 Java对象类型源码阅读——Object

Object类是所有类的父类,其它类经常需要重写这之中的hashCode(), equals(), toString()三个方法一、hashCode()、equals()、toString()hashCode() 方法返回一个对象对应的哈希值,这与哈希表相关的数据结构,如HashMap,有很大关系。Object类中hashCode()的返回值依赖于JVM,保证了不同对象的哈希值不同。其它类可以重写hashCode()方法,但这一方法要满足以下三个要求:同一应用的一次运行期间,同一对象的哈希值永远相

2020-12-19 14:12:23 139 1

原创 Java集合框架源码阅读——ArrayList

ArrayList是Java中提供的动态数组结构,其父类为AbstractList<E>,实现了List<E>, RandomAccess, Cloneable, Serializable四个接口一、ArrayList的初始化ArrayList中包括一个静态变量DEFAULT_CAPACITY,值固定为10,用来规定一个ArrayList对象的默认初始容量。当new ArrayList时,若不指定初始容量,则初始容量为10。 /** * Default initial ca

2020-10-27 23:31:27 193

原创 利用d3.js实现图的可视化

d3.js是数据可视化的JavaScript库,可以在网页上实现图的力导向图的绘制,以下代码参考自一个很好的v5版d3.js教程https://blog.csdn.net/qq_34414916/article/details/80026029<!DOCTYPE html><html> <head> <title>demo.html</title> <script type="text/javascript" src=

2020-07-17 17:29:45 1120

原创 使用JavaScript操作HTML元素

1.选择元素,共三种方法var a = document.getElementById("id");var b = document.getElementsByTagName("p");var c = document.getElementsByName("name");第一种是根据HTML元素的id选择唯一的一个元素,因为HTML的id是唯一的。第二种是根据标签选择元素,返回的是所有 ...

2020-05-04 21:35:02 747

原创 使用ajax+SpringMVC实现前后端数据传递

在不使用ajax技术时,可以在jsp页面上发出一个"xxx.do?param=xxx"的请求,将参数param传到后台,后台Controller类中对应的方法返回ModelAndView对象,前端可以用EL表达式接受返回的数据。这么做会让整个jsp页面刷新一次。如果已经在网页上做了一些操作,比如在输入框中输入了一些东西,那jsp刷新之后输入的内容也都不存在了。使用ajax技术可以解决这种问题。...

2020-04-13 22:21:45 642 1

原创 C++函数退出时出现异常

对一个函数进行调试void fun1(){ code……}执行所有语句都没有问题,当执行到最后一个“}”时抛出异常。这表明程序在回收函数的局部变量时出现异常。对于基本类型如int类型程序能够直接回收,对于类、结构体类型变量回收时会调用其析构函数,因此这时应该检查这个函数中使用的自定义的类、结构体的析构函数有没有问题。...

2020-02-19 15:15:11 1506

原创 windows平台vs2015环境下安装boost库

到官网 https://www.boost.org 下载boost库。将下载的压缩包解压,双击运行bootstrap.bat文件,运行后会在当前目录下得到一个b2.exe文件(老版本会生成bjam.exe文件)双击运行b2.exe,这时会对boost库进行编译,控制台会打印出许多信息。结束后boost库就已经安装完成了。打开vs2015,在右侧解决方案上点击右键->属性。在C/C++...

2020-02-14 14:50:12 328

原创 k-truss

k-truss是一种子图结构,用于在图中寻找凝聚子图。类似的结构还有k-core支持度(support):图的一条边e包含在k个三角形中,则support(e) = kk-truss:图G的极大子图g。在g中,每条边的support >= k-2。(也可以简化定义为support >= k)很明显,对于两个正整数k1>k2k_1\gt k_2k1​>k2​,k1k_...

2019-12-22 20:50:05 5313 4

原创 DBLP学者合作关系数据集的制作

DBLP是一个计算机领域的

2019-11-04 19:54:43 2059 8

原创 普通人的2019年计算机保研经历(北理、北交、南开夏令营)

本人情况: 东北某211高校,计算机科学与技术专业,成绩排名4/92,六级480+。获得过数学建模国二,还有两个省级奖项。有过一段约等于没有的科研经历。夏令营情况: 北理工(优营)、北交大(优营)、南开(通过学校面试,未通过实验室考核)、人大(未入营)、天大(未入营)、信工所(未入营)、北航(未入营)我的本人情况,很弱;夏令营情况,很惨。也许很多人都是这样的——没什么突出成绩,到最后发现牛人真...

2019-10-11 13:45:39 6179 16

原创 极大团枚举——Bron-Kerbosh算法

**团(clique):**一个图中的完全子图**极大团(maximal clique):**不被另一个更大的团包含的团**最大团(maximum clique):**含有顶点最多的团**算法思想:**定义两个集合Q和SUBG,Q是一个团包含的的顶点,SUBG是与Q中所有顶点都相邻的顶点集合。将SUBG中任意一个点q加入Q中后,Q是一个更大的团。之后重新计算SUBG(保留SUBG中与q相邻的...

2019-10-08 17:16:38 2132

原创 k-core

k-core:图G中的最大完全子图Gk,Gk中的所有顶点的度deg(v)≥kcore number:一个顶点属于k-core,但不属于(k+1)-core,则这个顶点的core number=k性质:1.对于1 ≤ k < kmax,Gk+1是Gk的子图2.k-core不一定是连通子图3.Gk是所有core number ≥ k的顶点的诱导子图core composition:计...

2019-09-20 21:12:37 5164 3

原创 C++中的常量指针

一、不能修改所指变量内容的指针声明指针时,将const放在 ‘*’ 前面,代表不能通过这个指针改变所指变量的值,但可以改变这个指针所指向的对象。这种称作底层const int a = 1; int b = 2; int const *p1 = &a; const int *p2 = &a; //与上一条语句等价 *p1 = 2; //错误,不能通过p1修改变...

2019-09-19 22:41:34 218

原创 2019年北理工计算机夏令营机试

1.第一行输入两个整数m,n(m,n<50),之后输入一个m行n列的矩阵,其中0代表空格,1代表白纸,2代表墨水。每经过1秒,墨水会将上下左右相邻的白纸部分染色成墨水,求经过多长时间所有的白纸部分都变成墨水。若不能完全染色,则输出FALSE#include <stdio.h>#include <string.h>#include using namespace...

2019-07-18 14:44:01 1666 11

原创 表单数据传到后台变成乱码的解决办法

在前端的表单中输入中文字符存入数据库,发现字符会变成乱码。本来以为是数据库的编码问题,后来发现不是。在数据作为参数传入Controller层的某个方法后字符串就已经变成乱码了。需要在后端代码中对字符串重新编码:str = new String(str.getBytes("ISO8859_1") , "utf-8"));...

2019-06-09 22:47:53 1532

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除