Init
This commit is contained in:
155
cppdraft/thread/latch/class.md
Normal file
155
cppdraft/thread/latch/class.md
Normal file
@@ -0,0 +1,155 @@
|
||||
[thread.latch.class]
|
||||
|
||||
# 32 Concurrency support library [[thread]](./#thread)
|
||||
|
||||
## 32.9 Coordination types [[thread.coord]](thread.coord#thread.latch.class)
|
||||
|
||||
### 32.9.2 Latches [[thread.latch]](thread.latch#class)
|
||||
|
||||
#### 32.9.2.3 Class latch [thread.latch.class]
|
||||
|
||||
namespace std {class latch {public:static constexpr ptrdiff_t max() noexcept; constexpr explicit latch(ptrdiff_t expected); ~latch();
|
||||
|
||||
latch(const latch&) = delete;
|
||||
latch& operator=(const latch&) = delete; void count_down(ptrdiff_t update = 1); bool try_wait() const noexcept; void wait() const; void arrive_and_wait(ptrdiff_t update = 1); private: ptrdiff_t counter; // *exposition only*};}
|
||||
|
||||
[1](#1)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/threads.tex#L10720)
|
||||
|
||||
A latch maintains an internal counter
|
||||
that is initialized when the latch is created[.](#1.sentence-1)
|
||||
|
||||
Threads can block on the latch object,
|
||||
waiting for counter to be decremented to zero[.](#1.sentence-2)
|
||||
|
||||
[2](#2)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/threads.tex#L10726)
|
||||
|
||||
Concurrent invocations of the member functions of latch,
|
||||
other than its destructor, do not introduce data races[.](#2.sentence-1)
|
||||
|
||||
[ð](#lib:max,latch)
|
||||
|
||||
`static constexpr ptrdiff_t max() noexcept;
|
||||
`
|
||||
|
||||
[3](#3)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/threads.tex#L10736)
|
||||
|
||||
*Returns*: The maximum value of counter that the implementation supports[.](#3.sentence-1)
|
||||
|
||||
[ð](#lib:latch,constructor)
|
||||
|
||||
`constexpr explicit latch(ptrdiff_t expected);
|
||||
`
|
||||
|
||||
[4](#4)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/threads.tex#L10747)
|
||||
|
||||
*Preconditions*: expected >= 0 is true andexpected <= max() is true[.](#4.sentence-1)
|
||||
|
||||
[5](#5)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/threads.tex#L10752)
|
||||
|
||||
*Effects*: Initializes counter with expected[.](#5.sentence-1)
|
||||
|
||||
[6](#6)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/threads.tex#L10756)
|
||||
|
||||
*Throws*: Nothing[.](#6.sentence-1)
|
||||
|
||||
[ð](#lib:count_down,latch)
|
||||
|
||||
`void count_down(ptrdiff_t update = 1);
|
||||
`
|
||||
|
||||
[7](#7)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/threads.tex#L10767)
|
||||
|
||||
*Preconditions*: update >= 0 is true, andupdate <= counter is true[.](#7.sentence-1)
|
||||
|
||||
[8](#8)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/threads.tex#L10772)
|
||||
|
||||
*Effects*: Atomically decrements counter by update[.](#8.sentence-1)
|
||||
|
||||
If counter is equal to zero,
|
||||
unblocks all threads blocked on *this[.](#8.sentence-2)
|
||||
|
||||
[9](#9)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/threads.tex#L10778)
|
||||
|
||||
*Synchronization*: Strongly happens before the returns from all calls that are unblocked[.](#9.sentence-1)
|
||||
|
||||
[10](#10)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/threads.tex#L10782)
|
||||
|
||||
*Throws*: system_error when an exception is required ([[thread.req.exception]](thread.req.exception "32.2.2 Exceptions"))[.](#10.sentence-1)
|
||||
|
||||
[11](#11)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/threads.tex#L10786)
|
||||
|
||||
*Error conditions*: Any of the error conditions
|
||||
allowed for mutex types ([[thread.mutex.requirements.mutex]](thread.mutex.requirements.mutex "32.6.4.2 Mutex types"))[.](#11.sentence-1)
|
||||
|
||||
[ð](#lib:try_wait,latch)
|
||||
|
||||
`bool try_wait() const noexcept;
|
||||
`
|
||||
|
||||
[12](#12)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/threads.tex#L10798)
|
||||
|
||||
*Returns*: With very low probability false[.](#12.sentence-1)
|
||||
|
||||
Otherwise counter == 0[.](#12.sentence-2)
|
||||
|
||||
[ð](#lib:wait,latch)
|
||||
|
||||
`void wait() const;
|
||||
`
|
||||
|
||||
[13](#13)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/threads.tex#L10809)
|
||||
|
||||
*Effects*: If counter equals zero, returns immediately[.](#13.sentence-1)
|
||||
|
||||
Otherwise, blocks on *this until a call to count_down that decrements counter to zero[.](#13.sentence-2)
|
||||
|
||||
[14](#14)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/threads.tex#L10816)
|
||||
|
||||
*Throws*: system_error when an exception is required ([[thread.req.exception]](thread.req.exception "32.2.2 Exceptions"))[.](#14.sentence-1)
|
||||
|
||||
[15](#15)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/threads.tex#L10820)
|
||||
|
||||
*Error conditions*: Any of the error conditions
|
||||
allowed for mutex types ([[thread.mutex.requirements.mutex]](thread.mutex.requirements.mutex "32.6.4.2 Mutex types"))[.](#15.sentence-1)
|
||||
|
||||
[ð](#lib:arrive_and_wait,latch)
|
||||
|
||||
`void arrive_and_wait(ptrdiff_t update = 1);
|
||||
`
|
||||
|
||||
[16](#16)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/threads.tex#L10832)
|
||||
|
||||
*Effects*: Equivalent to:count_down(update);
|
||||
wait();
|
||||
23
cppdraft/thread/latch/general.md
Normal file
23
cppdraft/thread/latch/general.md
Normal file
@@ -0,0 +1,23 @@
|
||||
[thread.latch.general]
|
||||
|
||||
# 32 Concurrency support library [[thread]](./#thread)
|
||||
|
||||
## 32.9 Coordination types [[thread.coord]](thread.coord#thread.latch.general)
|
||||
|
||||
### 32.9.2 Latches [[thread.latch]](thread.latch#general)
|
||||
|
||||
#### 32.9.2.1 General [thread.latch.general]
|
||||
|
||||
[1](#1)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/threads.tex#L10677)
|
||||
|
||||
A latch is a thread coordination mechanism
|
||||
that allows any number of threads to block
|
||||
until an expected number of threads arrive at the latch
|
||||
(via the count_down function)[.](#1.sentence-1)
|
||||
|
||||
The expected count is set when the latch is created[.](#1.sentence-2)
|
||||
|
||||
An individual latch is a single-use object;
|
||||
once the expected count has been reached, the latch cannot be reused[.](#1.sentence-3)
|
||||
Reference in New Issue
Block a user