From 248ea377851cf6e8354050d2bb955973db361fe2 Mon Sep 17 00:00:00 2001 From: Xu Shaohua Date: Tue, 13 Aug 2024 21:14:21 +0800 Subject: [PATCH] Add cds --- Cargo.toml | 48 +++++++++---------- cds/Cargo.toml | 7 +++ cds/src/lib.rs | 13 +++++ cds/src/lock_coupling_linked_list.rs | 30 ++++++++++++ src/SUMMARY.md | 12 +++++ .../concurrent-deque.md | 1 + .../concurrent-hash-map.md | 1 + .../concurrent-linked-list.md | 1 + .../concurrent-queue.md | 10 ++++ .../concurrent-radix-tree.md | 1 + .../concurrent-ring-buffer.md | 3 ++ .../concurrent-skip-list-map.md | 1 + .../concurrent-skip-list-set.md | 1 + src/concurrent-data-structures/index.md | 1 + src/concurrent-data-structures/intro.md | 29 +++++++++++ .../lock-coupling-linked-list.md | 1 + src/concurrent-data-structures/skip-graph.md | 5 ++ 17 files changed, 141 insertions(+), 24 deletions(-) create mode 100644 cds/Cargo.toml create mode 100644 cds/src/lib.rs create mode 100644 cds/src/lock_coupling_linked_list.rs create mode 100644 src/concurrent-data-structures/concurrent-deque.md create mode 100644 src/concurrent-data-structures/concurrent-hash-map.md create mode 100644 src/concurrent-data-structures/concurrent-linked-list.md create mode 100644 src/concurrent-data-structures/concurrent-queue.md create mode 100644 src/concurrent-data-structures/concurrent-radix-tree.md create mode 100644 src/concurrent-data-structures/concurrent-ring-buffer.md create mode 100644 src/concurrent-data-structures/concurrent-skip-list-map.md create mode 100644 src/concurrent-data-structures/concurrent-skip-list-set.md create mode 100644 src/concurrent-data-structures/index.md create mode 100644 src/concurrent-data-structures/intro.md create mode 100644 src/concurrent-data-structures/lock-coupling-linked-list.md create mode 100644 src/concurrent-data-structures/skip-graph.md diff --git a/Cargo.toml b/Cargo.toml index b3511215..3550f977 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,31 +1,31 @@ - [workspace] resolver = "2" members = [ - "array", - "backtracking", - "bit_manipulation", - "ciphers", - "conversions", - "deque", - "dynamic_programming", - "graph", - "hash_table", - "list", - "math", - "priority_queue", - "queue", - "search", - "sort", - "src/leetcode/0*.*", - "src/leetcode/1*.*", - "src/leetcode/2*.*", - "src/leetcode/3*.*", - "stack", - "string", - "tree", - "vector", + "array", + "backtracking", + "bit_manipulation", + "cds", + "ciphers", + "conversions", + "deque", + "dynamic_programming", + "graph", + "hash_table", + "list", + "math", + "priority_queue", + "queue", + "search", + "sort", + "src/leetcode/0*.*", + "src/leetcode/1*.*", + "src/leetcode/2*.*", + "src/leetcode/3*.*", + "stack", + "string", + "tree", + "vector", ] [profile.release] diff --git a/cds/Cargo.toml b/cds/Cargo.toml new file mode 100644 index 00000000..8108a630 --- /dev/null +++ b/cds/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "cds" +version = "0.1.0" +edition = "2021" +publish = false + +[dependencies] diff --git a/cds/src/lib.rs b/cds/src/lib.rs new file mode 100644 index 00000000..f301b689 --- /dev/null +++ b/cds/src/lib.rs @@ -0,0 +1,13 @@ +// Copyright (c) 2024 Xu Shaohua . All rights reserved. +// Use of this source is governed by General Public License that can be found +// in the LICENSE file. + +#![deny( + warnings, + clippy::all, + clippy::cargo, + clippy::nursery, + clippy::pedantic +)] + +//pub mod lock_coupling_linked_list; diff --git a/cds/src/lock_coupling_linked_list.rs b/cds/src/lock_coupling_linked_list.rs new file mode 100644 index 00000000..298e50e2 --- /dev/null +++ b/cds/src/lock_coupling_linked_list.rs @@ -0,0 +1,30 @@ +// Copyright (c) 2024 Xu Shaohua . All rights reserved. +// Use of this source is governed by GNU General Public License +// that can be found in the LICENSE file. + +use std::ptr::NonNull; +use std::sync::Mutex; + +pub struct LockCouplingLinkedList { + len: usize, + head: NodePtr, +} + +type NodePtr = Mutex>>>; + +pub struct Node { + next: NodePtr, + value: T, +} + +impl LockCouplingLinkedList {} + +impl Node { + #[must_use] + fn new(value: T) -> Self { + Self { + next: Mutex::new(None), + value, + } + } +} \ No newline at end of file diff --git a/src/SUMMARY.md b/src/SUMMARY.md index b6565842..fe533864 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -101,6 +101,18 @@ - [广度优先搜索 BFS](graph/bfs.md) - [最短路径](graph/shortest-path.md) - [最小生成树](graph/minimum-spanning-tree.md) +- [并发数据结构 Concurrent Data Structures](concurrent-data-structures/index.md) + - [简介](concurrent-data-structures/intro.md) + - [Lock-coupling Linked List](concurrent-data-structures/lock-coupling-linked-list.md) + - [Concurrent Ring Buffer](concurrent-data-structures/concurrent-ring-buffer.md) + - [Concurrent Hash Map](concurrent-data-structures/concurrent-hash-map.md) + - [Concurrent Linked List](concurrent-data-structures/concurrent-linked-list.md) + - [Concurrent Deque](concurrent-data-structures/concurrent-deque.md) + - [Concurrent Queue](concurrent-data-structures/concurrent-queue.md) + - [Concurrent SkipList Map](concurrent-data-structures/concurrent-skip-list-map.md) + - [Concurrent SkipList Set](concurrent-data-structures/concurrent-skip-list-set.md) + - [Concurrent Radix Tree](concurrent-data-structures/concurrent-radix-tree.md) + - [Skip Graph](concurrent-data-structures/skip-graph.md) # 第二部分: 算法 Algorithms diff --git a/src/concurrent-data-structures/concurrent-deque.md b/src/concurrent-data-structures/concurrent-deque.md new file mode 100644 index 00000000..19335d19 --- /dev/null +++ b/src/concurrent-data-structures/concurrent-deque.md @@ -0,0 +1 @@ +# Concurrent Deque \ No newline at end of file diff --git a/src/concurrent-data-structures/concurrent-hash-map.md b/src/concurrent-data-structures/concurrent-hash-map.md new file mode 100644 index 00000000..6c030225 --- /dev/null +++ b/src/concurrent-data-structures/concurrent-hash-map.md @@ -0,0 +1 @@ +# Concurrent Hash Map \ No newline at end of file diff --git a/src/concurrent-data-structures/concurrent-linked-list.md b/src/concurrent-data-structures/concurrent-linked-list.md new file mode 100644 index 00000000..e6306c10 --- /dev/null +++ b/src/concurrent-data-structures/concurrent-linked-list.md @@ -0,0 +1 @@ +# Concurrent List \ No newline at end of file diff --git a/src/concurrent-data-structures/concurrent-queue.md b/src/concurrent-data-structures/concurrent-queue.md new file mode 100644 index 00000000..b6c6eef4 --- /dev/null +++ b/src/concurrent-data-structures/concurrent-queue.md @@ -0,0 +1,10 @@ +# Concurrent Queue + +Multi-producer, multi-consumer lock-free FIFO + +## 参考 + +- [ConcurrentQueue](https://github.com/cameron314/concurrentqueue) +- [A Fast General Purpose Lock-Free Queue for C++](https://moodycamel.com/blog/2014/a-fast-general-purpose-lock-free-queue-for-c++) +- [A Fast Lock-Free Queue for C++](https://moodycamel.com/blog/2013/a-fast-lock-free-queue-for-c++) +- [Detailed Design of a Lock-Free Queue](https://moodycamel.com/blog/2014/detailed-design-of-a-lock-free-queue) \ No newline at end of file diff --git a/src/concurrent-data-structures/concurrent-radix-tree.md b/src/concurrent-data-structures/concurrent-radix-tree.md new file mode 100644 index 00000000..26522931 --- /dev/null +++ b/src/concurrent-data-structures/concurrent-radix-tree.md @@ -0,0 +1 @@ +# Concurrent Radix Tree \ No newline at end of file diff --git a/src/concurrent-data-structures/concurrent-ring-buffer.md b/src/concurrent-data-structures/concurrent-ring-buffer.md new file mode 100644 index 00000000..b295d21c --- /dev/null +++ b/src/concurrent-data-structures/concurrent-ring-buffer.md @@ -0,0 +1,3 @@ +# Concurrent Ring Buffer + +Single-producer, single-consumer lock-free FIFO \ No newline at end of file diff --git a/src/concurrent-data-structures/concurrent-skip-list-map.md b/src/concurrent-data-structures/concurrent-skip-list-map.md new file mode 100644 index 00000000..f3301bdc --- /dev/null +++ b/src/concurrent-data-structures/concurrent-skip-list-map.md @@ -0,0 +1 @@ +# Concurrent SkipList Map \ No newline at end of file diff --git a/src/concurrent-data-structures/concurrent-skip-list-set.md b/src/concurrent-data-structures/concurrent-skip-list-set.md new file mode 100644 index 00000000..b713d6d1 --- /dev/null +++ b/src/concurrent-data-structures/concurrent-skip-list-set.md @@ -0,0 +1 @@ +# Concurrent SkipList Set \ No newline at end of file diff --git a/src/concurrent-data-structures/index.md b/src/concurrent-data-structures/index.md new file mode 100644 index 00000000..6e67a382 --- /dev/null +++ b/src/concurrent-data-structures/index.md @@ -0,0 +1 @@ +# 并发数据结构 Concurrent Data Structures diff --git a/src/concurrent-data-structures/intro.md b/src/concurrent-data-structures/intro.md new file mode 100644 index 00000000..0d3be6b0 --- /dev/null +++ b/src/concurrent-data-structures/intro.md @@ -0,0 +1,29 @@ +# 简介 + +并发数据结构 Concurrent data structures, CDS 有三个关键的主题: + +- 安全 Safety, 满足多线程并发的规范 + - 顺序规则 sequential specification, 像一个队列一样按顺序操作 + - 同步 synchronization +- 可扩展性 Scalability, 随着处理器核心数的增多, 性能更好 + - 理想情况下, 线性递增 + - 实际情况, 超过 16 个线程之后, 会退化成次线性递增 (sublinear scaling) +- 有进度 Progress, 保证操作过程向前推进 + - lock freedom: 至少有一个进度向前推进 + - wait freedom: 所有的进度都向前推进 + +## 安全性 Safety + +使用锁或者其它同步原语 (primitive synchronization) 来保护并发数据结构. + +- 使用全局锁来保护顺序数据结构 +- 使用自定义的同步协议来保护数据结构 + +## 可扩展性 Scalability + +- 减少锁保护的作用域 + - 读写锁 read-write locking + - hand-over-hand locking + - lock coupling +- 避免写数据以便减少无效的缓存 + - 乐观锁 \ No newline at end of file diff --git a/src/concurrent-data-structures/lock-coupling-linked-list.md b/src/concurrent-data-structures/lock-coupling-linked-list.md new file mode 100644 index 00000000..8635e85e --- /dev/null +++ b/src/concurrent-data-structures/lock-coupling-linked-list.md @@ -0,0 +1 @@ +# Lock-coupling Linked List \ No newline at end of file diff --git a/src/concurrent-data-structures/skip-graph.md b/src/concurrent-data-structures/skip-graph.md new file mode 100644 index 00000000..654f742d --- /dev/null +++ b/src/concurrent-data-structures/skip-graph.md @@ -0,0 +1,5 @@ +# Skip Graph + +## 参考 + +- [Skip graph](https://en.wikipedia.org/wiki/Skip_graph) \ No newline at end of file