内存对齐
很多时候你需要计算自己创建出来的结构体的size,给出下面这个结构体
1 | struct A |
sizeof(A)
的值是多少 -> 56
sizeof(AlignA)
的值是多少 -> 48
线程跟进程的差别
- 线程之间共享地址空间,每个进程有自己的地址空间
- 线程的资源占用更小,线程是处理器调度的基本单位
线程安全
锁
互斥锁
可重入锁
不可重入锁
自旋锁
获取锁的时候将循环等待(tryLock), 由于不会发生线程状态的切换,减少了线程上下文切换的损耗,但是循环等待会消耗更多的CPU
很多时候你需要计算自己创建出来的结构体的size,给出下面这个结构体
1 | struct A |
sizeof(A)
的值是多少 -> 56
sizeof(AlignA)
的值是多少 -> 48
获取锁的时候将循环等待(tryLock), 由于不会发生线程状态的切换,减少了线程上下文切换的损耗,但是循环等待会消耗更多的CPU
一些自用的部署运维相关的资料和脚本 地址
1 | 把男生女生分开看 |
1 | f[i]表示这个节点最多能往上延伸多少步(包括i这个节点) |
序列DP,题目描述不清楚,记住是连续子序列,就是子串,刚开始按照不连续的去做了。
1 | f[i][0] 表示 以 i 结尾的最长子串 |
最近由于个人原因需要进行一些前端页面的开发,所以就对一些前端框架进行了调研。我本来想继续用之前的layui一把梭直接搞的,但是想想还是应该接触一些新东西,所以就以react框架来作为我前端开发的一小步吧。
可以直接看官网的这个,很简单
https://react.docschina.org/tutorial/tutorial.html#setup-option-2-local-development-environment
https://www.yarnpkg.cn/getting-started/install
https://cra.nodejs.cn/docs/getting-started/#yarn
https://reactrouter.com/en/main
在App.js内,你可以
1 | import { BrowserRouter, Route, Routes } from 'react-router-dom'; |
上面的path对应的就是子页面的路径,element对应的就是这个页面的子组件
然后对应的实现各个组件就可以进行子页面开发啦。
用脚手架生成的打包命令是npm run build
,但是如果你的代码里面的import有通过相对路径进行引入的,就需要改一下脚手架生成的package.json
加上”homepage”:”./“那一行
1 | { |
改变state的时候要用setState函数操作变量,而不是直接对绑定的变量进行操作
详情可见:
https://www.runoob.com/react/react-state.html
重定向页面 window.location.replace(XXXX)
本文主要整理了一下如何使用C++14编写一个属于自己的线程池。
详细代码位于 https://github.com/dxyinme/ezlib/tree/main/thread/threadpool
虽然现在协程在很多情况下已经成为了后台开发的一个主流选择,但是线程以及线程池在整个后台开发的流程中依然很常见。这里介绍一个简单的线程池的使用以及设计编写方法。
我们首先需要一个对任务的定义。一个线程池的作用就是为了并发的去执行一系列不相关的任务的。所以我们定义了如下任务
1 | class ThTask { |
对于具体的一个任务,我们只需要用一个新的Task类,继承ThTask,实现TaskDo这个函数就可以。而且我们可以利用condition_variable的特性,使得主线程在Wait的时候挂起,直到这个task结束的时候才被唤醒。
上述功能的实现方式如下:
1 | void ThTask::Wait() { |
线程池可以被看成是若干个互不相关的线程,每个线程会定时去获取任务,这是使用触发式的任务启动。
具体实现方式建下面的代码。
1 | for (;;) { |
同样的,只有在commit任务的时候才会触发线程池取任务。为了防止多个线程产生任务争强的情况,每次commit的时候只唤醒一个线程。
1 | void ThPool::Commit(std::shared_ptr<ThTask> task_ptr) { |
这里是一个对线程池的简单介绍和一种实现,当然也有其他的实现方式,TODO学习中。
ABC224E
一道atcoder的图论题
给你一个H * W
的方格矩形,其中有N
个格子有正整数,其他的格子数字都是0
, 每个有正整数的格子上面都有一块木板,你可以让一个木板从一个方格A
,传送到另一个方格B
,但是要遵循下列条件:
B
的数字严格大于A
的数字B
和A
在同一行或者同一列对于每个木板,输出它最多能传送多少次
看到这个我们很容易就可以想到反向建图之后,跑拓扑排序。对于每行每列按照非0
格子的数字从大到小,对编号进行排序,每个点对所有数字小于自己中,数字最大的点建边,但是这样可能会出现N * N
级别的边。所以在每个数字相同的点集合之间建边需要一个特殊的点,拓扑排序记录每个点是第几层,最后除以2
就可以(去掉特殊点对距离的影响)。
1 | #include <bits/stdc++.h> |
一些libpng相关的内容
1 | sudo apt-get install python3-pip |
下载地址 https://sourceforge.net/projects/libpng/files/
解压之后
1 | ./configure |
libpng好像还需要依赖zlib
zlib 走这个下载 https://zlib.net/
然后基本也是跟libpng一样的安装方式。
就装好了,要用的话就在cmake链接里面加一下就行
1 | cmake_minimum_required(VERSION 3.1) |
1 | # coding: utf-8 |
这是一个把jpg文件转换成png文件的脚本,为啥要这样呢,主要是因为这里主要是在用libpng玩东西,所以有了这么个脚本
https://gitee.com/dxyinme/uxpng 这里是我学习libpng相关的一些操作和实践
1 | //摘抄自libpng的定义 |
先不考虑调色板的话,PNG一共有4种格式。抛开固定格式,整个图的存储方式大致是一个二维的矩阵,矩阵的每个元素可以被看成是一个像素, 每个像素按照自己的图像类型,以某些特定的方式排列。例如RGB类型的图像,他的排列方式就是
1 | |B|G|R| // 通道数为3 |
如果是RGB-alpha(有透明通道)的图像,他的排序方式就是
1 | B|G|R|A| // 通道数为4 |
灰度图和灰度透明图只有一个(两个)通道,用来表示每个像素的灰度和透明度。
1 | fp = fopen(img_path, "rb"); // 打开文件 |
首先,先获取图像的基本信息
1 | int channels, color_type, bit_depth, width, height; |
其次再获取整个图像矩阵
1 | auto row_pointers = png_get_rows(png_ptr, info_ptr); |
这里的图像矩阵的高是height,宽是 channels * width 读取像素的时候需要获取连续channels个元素。
1 | png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr); // 这里要设置成write_struct |
按行写入图像的某个图像行,这个是按顺序的,调用一次,下一次写的行数+1。
1 | png_write_row(png_ptr, row_ptr); |
国庆在家里实在是无聊透顶,在写算法题的时候发现一个事情,c++的std::sort是不支持链式数据结构的,所以就想着能不能做一个给单向链表排序的排序算法。所有相关代码被放在 GITEE:dxyinme/Vsort
我们先设计了一个单链表结构VListNode
如下:
1 | template<typename T> |
如果我们要合并两个有序的单链表,那么我们就只需要每次选择一个链表里面最大的元素就可以。这个很简单,详见 Vsort::MergeList,可以合并两个有序单向链表的话,我们就可以做一个归并排序,每次O(n)
选取整个链表的中点,将整个链表从中点切成两个链表,切完之后,递归继续,直到只剩下一个元素为止。
我们对于
单只有链表排序肯定不够,而且性能也普通的std::sort对vector排序比差了不少,是否可以进行一个多线程的优化。
整个多线程排序分成三个部分:
1
和其他时候不一样,在这个冰冷的城市也还是会有比较热的几天的。就算是这几天的炎热,在晚上的时候也会消失殆尽。
没有蝉鸣,没有长时间的热风,只有植物在疯狂地生长扩张。
“在这种夜晚憧憬着柔软冰凉的东西的我一定是疯了吧...... ”,我这样想着。
“你就是他们所提到的那个人吗?”
身后的声音貌似在验证我的身份,而且,那种声音仿佛在期待着否定的答案。
“不是,我只是个普通的过路人而已。”,我这样回答。虽然我也不知道他们所提到的那个人是谁,但这对我一个赶路人来说,并不重要。
“你还记得我吗?我是你去H市之前见过的那个。”
“前几个月的时候你还没这么瘦啊。”
“诶诶诶你不会吧我忘了吧......”
“这个女人在自说自话什么啊?”,我这样想着,转过身说,“对不起我们不认识......”
“.......吧?”
显然是想收回刚刚的话,毕竟被眼前熟悉的面孔惊诧到了。
“喔,你不认得我啦?”
她渐渐靠近, “那我也要好好确认一下是不是你哦。”
她的手和脸靠了上来。
冰冷的手,我闭上了眼睛。
2
一次有人跟我说这里的住民有一些冷漠,但我还是依旧选择来到这个城市。
路上没有行人,偶尔路过的是一种带着翅膀的阴影。无法形容他们的样貌,大概跟所谓的“人”很相似吧。
当黎明到来的时候,这里的原住民会褪下翅膀,变为一些长着四肢和眼睛的生物。
身后有一个原住民对我说话,“你知道春天已经来了么?”。
清晨的第一缕阳光照射在他脸上,一半暗淡,一半明亮。
“我知道。”,我回答。
太阳升起。
“那就把冬天的记忆留在这里献给春天吧。”
雾气弥漫开来。
我转过身面对着他。
3
这里的夜很长。
夕阳落下的时候,那种长夜之前的平静,正是那个男人乐于欣赏的。
可惜今天下着雨,并不是晴天。
这是A城这个月最后一个白天。周围的路上没有人,大概要到夜晚才会出来活动吧。
他的腋下夹着一副画,用厚厚的帆布包裹着。
“带着温热触感的阳光什么时候才能照在我身上呢?”,他摇了摇头。
天完全暗了下去,蓝白色的街上只有他瘦长的背影。
雨停了,月光撕开了云层。“白天”开始了。
4
这里的太阳没有一点温度,甚至还在剥离着我身上的能量。
夏天是最不好受的,待在屋子里还暖和些,出门简直要被冻死。
当时间进入十一月份,你可以看见街道上的人正在渐渐变得有活力起来,
夜晚的灯光也比之前夏天的时候更柔和些。
“你们在准备什么?”,我叫住了一个原住民,他手上拿着积满灰尘的模具,向一个广场走着。
“你过来看看吧,外乡人。”
我跟随着他走向广场,身边的人越来越多,
他们手上或是拿着模具,或是拿着各种容器,彼此交谈着什么。
我看着他们把篮子,箱子,木桶放在地上。不一会儿,
乌云中洒落下稀稀拉拉的光点,接着越来越大,填满了所有的容器,我仿佛在原住民的脸上看到了许久不见的笑容。
“这就是感恩节,小伙子。”,刚刚的原住民拍了拍我,“这是他们欠我们的。”