Prior Art
4
kind bounded / unbounded sync / async
std::mpmc mpmc, mpsc, etc both sync
crossbeam mpmc, mpsc, etc both sync
async_channel mpmc both async
kanal mpmc both sync/async
Go channel mpmc both async
Slide 5
Slide 5 text
How do channels work?
5
Slide 6
Slide 6 text
● Allocate a fixed length area
Bounded
6
Sender
Receiver
Bounded
10
Sender
Receiver
● If there is no available data, reader would block
Block!
Slide 11
Slide 11 text
Bounded
11
HHH III CCC DDD EEE FFF GGG
Sender
Receiver
● If receiver is too slow, sender would block
Block!
Slide 12
Slide 12 text
Bounded
12
HHH DDD EEE FFF GGG
Sender
Sender Sender
Receiver
Receiver
● Actually, multiple senders and receivers work concurrently
Slide 13
Slide 13 text
Implementation Details
13
Slide 14
Slide 14 text
How to achieve block/unblock?
14
Slide 15
Slide 15 text
Block / Unblock
15
● Sync channel
○ thread api (park, unpark)
● Async channel
○ waker api
Slide 16
Slide 16 text
Block / Unblock
16
Sender
Receiver
Block!
Slide 17
Slide 17 text
Block / Unblock
17
Sender
Receiver
Waker
Waker list
● When block happens, store waker somewhere
Slide 18
Slide 18 text
Block / Unblock
18
CCC
Sender
Receiver
Waker1
Waker list
● When block happens, store waker somewhere
Pop from list
Slide 19
Slide 19 text
Depth of Wakerlist … 🚀
19
● For wakerlist, intrusive linked list would be much
performant
○ What are intrusive linked lists?
○ new internal semaphore based on intrusive lists
Slide 20
Slide 20 text
How to test concurrent code base?
20
Slide 21
Slide 21 text
How to test concurrent code base?
21
● Multi threaded
● Complex synchronization
● Atomic Operations
Slide 22
Slide 22 text
How to test concurrent code base?
22
Slide 23
Slide 23 text
How to test concurrent code base?
23
Detect Deadlocks! 🙌
Slide 24
Slide 24 text
About Loom internals …
24
Video 🎥: https://youtu.be/-MRCgyiCxWU?si=a4NNwSxVgke6AFwZ
Slide 📝: https://speakerdeck.com/kimuramotoyuki/bug-free-concurrency-in-rust