76 lines
2.8 KiB
Markdown
76 lines
2.8 KiB
Markdown
[saferecl.rcu.general]
|
||
|
||
# 32 Concurrency support library [[thread]](./#thread)
|
||
|
||
## 32.11 Safe reclamation [[saferecl]](saferecl#rcu.general)
|
||
|
||
### 32.11.2 Read-copy update (RCU) [[saferecl.rcu]](saferecl.rcu#general)
|
||
|
||
#### 32.11.2.1 General [saferecl.rcu.general]
|
||
|
||
[1](#1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/threads.tex#L12920)
|
||
|
||
RCU is a synchronization mechanism
|
||
that can be used for linked data structures
|
||
that are frequently read, but seldom updated[.](#1.sentence-1)
|
||
|
||
RCU does not provide mutual exclusion,
|
||
but instead allows the user to schedule specified actions
|
||
such as deletion at some later time[.](#1.sentence-2)
|
||
|
||
[2](#2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/threads.tex#L12928)
|
||
|
||
A class type T is [*rcu-protectable*](#def:rcu-protectable "32.11.2.1 General [saferecl.rcu.general]") if it has exactly one base class of type rcu_obj_base<T, D> for some D, and that base is public and non-virtual, and
|
||
it has no base classes of type rcu_obj_base<X, Y> for any other combination X, Y[.](#2.sentence-1)
|
||
|
||
An object is rcu-protectable if it is of rcu-protectable type[.](#2.sentence-2)
|
||
|
||
[3](#3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/threads.tex#L12936)
|
||
|
||
An invocation of unlock U on an rcu_domain dom corresponds to an invocation of lock L on dom if L is sequenced before U and either
|
||
|
||
- [(3.1)](#3.1)
|
||
|
||
no other invocation of lock on dom is sequenced after L and before U, or
|
||
|
||
- [(3.2)](#3.2)
|
||
|
||
every invocation of unlock U2 on dom such that L is sequenced before U2 and U2 is sequenced before U corresponds to an invocation of lock L2 on dom such that L is sequenced before L2 and L2 is sequenced before U2[.](#3.sentence-1)
|
||
|
||
[*Note [1](#note-1)*:
|
||
|
||
This pairs nested locks and unlocks on a given domain in each thread[.](#3.sentence-2)
|
||
|
||
â *end note*]
|
||
|
||
[4](#4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/threads.tex#L12954)
|
||
|
||
A [*region of RCU protection*](#def:region_of_RCU_protection "32.11.2.1 General [saferecl.rcu.general]") on a domain dom starts with a lock L on dom and
|
||
ends with its corresponding unlock U[.](#4.sentence-1)
|
||
|
||
[5](#5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/threads.tex#L12959)
|
||
|
||
Given a region of RCU protection R on a domain dom and
|
||
given an evaluation E that scheduled another evaluation F in dom,
|
||
if E does not strongly happen before the start of R,
|
||
the end of R strongly happens before evaluating F[.](#5.sentence-1)
|
||
|
||
[6](#6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/threads.tex#L12965)
|
||
|
||
The evaluation of a scheduled evaluation is potentially concurrent with
|
||
any other scheduled evaluation[.](#6.sentence-1)
|
||
|
||
Each scheduled evaluation is evaluated at most once[.](#6.sentence-2)
|