C++、线程与任务

标准库对并发提供了一些支持: 内存模型:对并发访问的保障,希望访问能按照需求工作 programming without locks, 避免数据竞争 thread 库,在 thread lock 等原语层次上 task 支持库,在 Future, Task 这些层次上 层次由低到高,你应该选择更高的层次 需要解决的问题 位字段带来的整数bytes内的内存位置: struct { int x: 3; int y: 5;} 这样的位字段中,多个处理器读/写 x, y 实际上会把 这 1bytes 的位置都加载,考虑到: thread1: 从内存读, 修改 x, 写回 thr

LevelDB-源码阅读-Version(施工现场,请勿阅读)

其实按顺序来看,我看的不是 Version 的,但是这个地方一开始看不太懂,而且挺感兴趣的,就先贴这个。 相关的结构先看看哪些东西和 Version 有关: $ tree | grep version| |-- version_edit_test| |-- version_set_test| |-- version_edit.cc| |-- version_edit.h| |-- version_edit_test.cc| |-- version_set.cc| |-- version_set.h| |-- version_set_test.cc Version

LevelDB-源码阅读:headers

数据结构阅读 > slice.h -> status.h -> iterator.h -> db.h> option.h -> db.h> 对于 Slice.h class LEVELDB_EXPORT Slice { public: // Create an empty slice. Slice() : data_(""), size_(0) { } // Create a slice that refers to d[0,n-1]. Slice(const char* d, size_t n) : data_

mwish-coding-style(持续更新)

编码与命名规范Commentcomment 遵照语言标准来定义,比如 Python 的 docstring 和注释,一般通过 editor 相关的东西辅助实现。一般包注释在一切东西之前,函数注释按照具体语言的规范实现。 这里说明一下,之前对 Golang 没啥明确标准,看了一会儿,这里直接复制了: Go提供两种注释风格,C的块注释风格/**/,C++的行注释风格// 每一个包都应该有包注释,位于文件的顶部,在包名出现之前。如果一个包有多个文件,包注释只需要出现在一个文件的顶部即可。包注释建议使用C注释风格,如果这个包特别简单,需要的注释很少,也可以选择使用C++注释风格。 每个public

Linux/Unix 内存

malloc 其实咱们都挺熟悉的… 但是实际上内存也有咱合理的操作。 program break小标题通常表示堆内存的边界,brk sbrk 系统调用可以调整堆内存的空间,同时,程序试图访问低于 &end 的位置的时候,会引发 segmentation fault 抛出信号 SIGSEGV 。sbrk 则是增加堆内存。 stdlib: malloc/free我们熟悉的 malloc 和 free… program break 到达上限的时候返回 NULL 设置 errno free 实际上不降低 program break ,只是把内存添加到 freelist 中。两次 free 同一

Raft论文阅读(Lab2B)

代码变换State在 2A 中,我们完成了2个 rpc, 并利用这两种 rpc 完成了领导选举。在 lab2B 中,我们需要实现同步的 log, 我们需要修改一下我们的结构,这里作出一定调整: //// 所有服务器持久保存的状态//type RaftState struct { // add in lab2A currentTerm int // 现在的任期, 初始化0 votedFor int // 当前获得选票的候选者的 ID raftSM RaftSM // add in lab2B // should be applied in all servers commitIndex

Linux/Unix文件3:文件锁

须知给文件加锁是一个比较常见的行为。一个进程可能常常会出现这种情况: 读取文件内容 更新文件内容 说一个极度常见的例子:用npm 或者pipenv 更新包的时候,更新 dependency 文件。这个东西肯定会碰到这种情况,我们也就需要 lock 了。锁实现有几种形式,我们这里都会涉及。 锁可以分成两种模式: 劝告锁(Advisory locking): 像线程同步的 mutex,需所有的参与线程同步 强制锁(Mandatory locking):不需要的 flock#include <sys/file.h>int flock(int, int); 第一参数是 fd, 第

Unix文件读写-2

Unix 文件读写: buffer上一节我们了解了 open read write close 甚至 fseek 这些接口。实际上类似存储的高速缓存,这些默认都不会直接写入/读取,而是从内核的 buffer 读取数据。 访问磁盘需要syscall , buffer 的大小能够减少这个syscall的开销。用户/系统 CPU性能提升,但是复制的代价提高了。 stdioC 初学者接触 stdio 的话应该是最早的,实际上 stdio I/O 函数封装了对缓冲的处理。setvbuf setbuf 指定了缓冲的形式,fflush 能够刷新用户缓冲区,对于内核缓冲,可以采用 fsync。同时 sync

Linux/Unix文件读写-1

system api: file我们用 tcp/ip 编程的时候,会考虑用 unix 系统编程相关的这些 api, 这里我们会演示基本的代码并贴出文档 #include <stdio.h>#include <stdlib.h>#include <fcntl.h>#include <unistd.h>void error_handling(char* message);int main(void){ int fd; char buf[]="NMSL!Wsngg, wmldsnmdez!\n"; fd=open("data.txt",

分布式lab2A

参考前一篇博客,这边本人实现了一个简单的 lab2A, 完成了 Raft 算法中的领导选举。 下面我会放出一些关键代码展示这个流程: 测试框架在 raft/test_test.go 中,我们可以看到一个 Election 的测试代码 func TestInitialElection2A(t *testing.T) { servers := 3 cfg := make_config(t, servers, false) defer cfg.cleanup() cfg.begin("Test (2A): initial election") // is a leade