0%

简单地来说,Arc就是为了让变量能够再线程间共享,可以通过clone(并不会真正地深拷贝)的方式将数据的所有权给其他线程。但是如果数据要在多个线程之间修改的话,为了保证一致性,需要上锁,可供选择的方式有Mutex和RwLock等等。

RwLock.write()返回的是一个RwLockWriteGuard,我们可以解引用访问其内容,也可以通过解引用修改其内容。

转载自

rust有自己的规则和约定用来组织模块,比如一个包最多可以有一个库crate,任意多个二进制crate、导入文件夹内的模块的两种约定方式... 知道这些约定,就可以快速了解rust的模块系统。 先把一些术语说明一下:

  • 是cargo的一个功能,当执行cargo new xxxx的时候就是创建了一个包。
  • crate是二进制或者库项目。rust约定在Cargo.toml的同级目录下包含src目录并且包含main.rs文件,就是与包同名的二进制crate,如果包目录中包含src/lib.rs,就是与包同名的crate。包内可以有多crate,多个crates就是一个模块的树形结构。如果一个包内同时包含src/main.rssrc/lib.rs,那么他就有两个crate,如果想有多个二进制craterust约定需要将文件放在src/bin目录下,每个文件就是一个单独的crate
  • crate根用来描述如何构建crate的文件。比如src/main.rs或者src/lib.rs就是crate根crate根文件将由Cargo传递给rustc来实际构建库或者二进制项目。
  • 带有Cargo.toml文件的包用来描述如何构建crate,一个包可以最多有一个库crate,任意多个二进制crate

github 代码地址

阅读全文 »

/proc/pid

对于每个进程,/proc都有一个以进程ID(PID)命名的子目录,如/proc/1863,其中包含了特定于该进程的信息。

/proc/1863为例,这是一个特定于PID为1863的进程的目录。下面是/proc/[pid]目录中一些重要文件或子目录的作用:

阅读全文 »

既然左值引用和右值引用都是地址,那么它们和指针有什么区别呢?引用可以看做是被限制的指针,和普通指针的区别在于,引用只能在声明的时候初始化,且不可更改。可以发现,引用和指针常量在功能上是等同的。

阅读全文 »

1
2
3
4
5
6
(gdb) info signal SIGUSR2
Signal Stop Print Pass to program Description
SIGUSR1 Yes Yes Yes User defined signal 1
(gdb) handle SIGUSR2 noprint nostop
Signal Stop Print Pass to program Description
SIGUSR1 No No Yes User defined signal

本文参考:

一、TOAST是什么?

TOAST是“The Oversized-Attribute Storage Technique”(超尺寸属性存储技术)的缩写,主要用于存储一个大字段的值。

要理解TOAST,我们要先理解页(BLOCK)的概念。在PG中,页是数据在文件存储中的基本单位,其大小是固定的且只能在编译期指定,之后无法修改,默认的大小为8KB。同时,PG不允许一行数据跨页存储。那么对于超长的行数据,PG就会启动TOAST,将大的字段压缩或切片成多个物理行存到另一张系统表中(TOAST表),这种存储方式叫行外存储

阅读全文 »

参考:

0x00 可变长类型

0. Datum 的 typlen 的约定

如果Datum 类型是 “byVal”,则Datum表示一个值。如果Datum 类型不是”byVal“,则Datum 表示一个指针:

typlen > 0, Datum 就指向固定长度字节流,比如int类型 typlen == -1, Datum 指向一个变长 varlena 结构体,比如char,varchar类型 typlen == -2, Datum 指向一个C语言风格的字符串;

因此,查看所有的变长数据类型:

1
SELECT typname FROM pg_type WHERE typlen = -1
阅读全文 »