Files
GopherGate/target/doc/tokio/sync/struct.Notify.html
2026-02-26 12:00:21 -05:00

274 lines
44 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Notifies a single task to wake up."><title>Notify in tokio::sync - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../" data-static-root-path="../../static.files/" data-current-crate="tokio" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../../static.files/storage-e2aeef58.js"></script><script defer src="sidebar-items.js"></script><script defer src="../../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../static.files/favicon-044be391.svg"></head><body class="rustdoc struct"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><rustdoc-topbar><h2><a href="#">Notify</a></h2></rustdoc-topbar><nav class="sidebar"><div class="sidebar-crate"><h2><a href="../../tokio/index.html">tokio</a><span class="version">1.49.0</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">Notify</a></h2><h3><a href="#">Sections</a></h3><ul class="block top-toc"><li><a href="#examples" title="Examples">Examples</a></li></ul><h3><a href="#implementations">Methods</a></h3><ul class="block method"><li><a href="#method.const_new" title="const_new">const_new</a></li><li><a href="#method.new" title="new">new</a></li><li><a href="#method.notified" title="notified">notified</a></li><li><a href="#method.notified_owned" title="notified_owned">notified_owned</a></li><li><a href="#method.notify_last" title="notify_last">notify_last</a></li><li><a href="#method.notify_one" title="notify_one">notify_one</a></li><li><a href="#method.notify_waiters" title="notify_waiters">notify_waiters</a></li></ul><h3><a href="#trait-implementations">Trait Implementations</a></h3><ul class="block trait-implementation"><li><a href="#impl-Debug-for-Notify" title="Debug">Debug</a></li><li><a href="#impl-Default-for-Notify" title="Default">Default</a></li><li><a href="#impl-RefUnwindSafe-for-Notify" title="RefUnwindSafe">RefUnwindSafe</a></li><li><a href="#impl-UnwindSafe-for-Notify" title="UnwindSafe">UnwindSafe</a></li></ul><h3><a href="#synthetic-implementations">Auto Trait Implementations</a></h3><ul class="block synthetic-implementation"><li><a href="#impl-Freeze-for-Notify" title="!Freeze">!Freeze</a></li><li><a href="#impl-Send-for-Notify" title="Send">Send</a></li><li><a href="#impl-Sync-for-Notify" title="Sync">Sync</a></li><li><a href="#impl-Unpin-for-Notify" title="Unpin">Unpin</a></li></ul><h3><a href="#blanket-implementations">Blanket Implementations</a></h3><ul class="block blanket-implementation"><li><a href="#impl-Any-for-T" title="Any">Any</a></li><li><a href="#impl-Borrow%3CT%3E-for-T" title="Borrow&#60;T&#62;">Borrow&#60;T&#62;</a></li><li><a href="#impl-BorrowMut%3CT%3E-for-T" title="BorrowMut&#60;T&#62;">BorrowMut&#60;T&#62;</a></li><li><a href="#impl-From%3CT%3E-for-T" title="From&#60;T&#62;">From&#60;T&#62;</a></li><li><a href="#impl-Into%3CU%3E-for-T" title="Into&#60;U&#62;">Into&#60;U&#62;</a></li><li><a href="#impl-TryFrom%3CU%3E-for-T" title="TryFrom&#60;U&#62;">TryFrom&#60;U&#62;</a></li><li><a href="#impl-TryInto%3CU%3E-for-T" title="TryInto&#60;U&#62;">TryInto&#60;U&#62;</a></li></ul></section><div id="rustdoc-modnav"><h2><a href="index.html">In tokio::<wbr>sync</a></h2></div></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><div class="width-limiter"><section id="main-content" class="content"><div class="main-heading"><div class="rustdoc-breadcrumbs"><a href="../index.html">tokio</a>::<wbr><a href="index.html">sync</a></div><h1>Struct <span class="struct">Notify</span>&nbsp;<button id="copy-path" title="Copy item path to clipboard">Copy item path</button></h1><rustdoc-toolbar></rustdoc-toolbar><span class="sub-heading"><a class="src" href="../../src/tokio/sync/notify.rs.html#202-215">Source</a> </span></div><pre class="rust item-decl"><code>pub struct Notify { <span class="comment">/* private fields */</span> }</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Notifies a single task to wake up.</p>
<p><code>Notify</code> provides a basic mechanism to notify a single task of an event.
<code>Notify</code> itself does not carry any data. Instead, it is to be used to signal
another task to perform an operation.</p>
<p>A <code>Notify</code> can be thought of as a <a href="struct.Semaphore.html" title="struct tokio::sync::Semaphore"><code>Semaphore</code></a> starting with 0 permits. The
<a href="struct.Notify.html#method.notified" title="method tokio::sync::Notify::notified"><code>notified().await</code></a> method waits for a permit to become available, and
<a href="struct.Notify.html#method.notify_one" title="method tokio::sync::Notify::notify_one"><code>notify_one()</code></a> sets a permit <strong>if there currently are no available
permits</strong>.</p>
<p>The synchronization details of <code>Notify</code> are similar to
<a href="https://doc.rust-lang.org/1.93.1/std/thread/functions/fn.park.html" title="fn std::thread::functions::park"><code>thread::park</code></a> and <a href="https://doc.rust-lang.org/1.93.1/std/thread/thread/struct.Thread.html#method.unpark" title="method std::thread::thread::Thread::unpark"><code>Thread::unpark</code></a> from std. A <a href="struct.Notify.html" title="struct tokio::sync::Notify"><code>Notify</code></a>
value contains a single permit. <a href="struct.Notify.html#method.notified" title="method tokio::sync::Notify::notified"><code>notified().await</code></a> waits for the permit to
be made available, consumes the permit, and resumes. <a href="struct.Notify.html#method.notify_one" title="method tokio::sync::Notify::notify_one"><code>notify_one()</code></a> sets
the permit, waking a pending task if there is one.</p>
<p>If <code>notify_one()</code> is called <strong>before</strong> <code>notified().await</code>, then the next
call to <code>notified().await</code> will complete immediately, consuming the permit.
Any subsequent calls to <code>notified().await</code> will wait for a new permit.</p>
<p>If <code>notify_one()</code> is called <strong>multiple</strong> times before <code>notified().await</code>,
only a <strong>single</strong> permit is stored. The next call to <code>notified().await</code> will
complete immediately, but the one after will wait for a new permit.</p>
<h2 id="examples"><a class="doc-anchor" href="#examples">§</a>Examples</h2>
<p>Basic usage.</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>tokio::sync::Notify;
<span class="kw">use </span>std::sync::Arc;
<span class="kw">let </span>notify = Arc::new(Notify::new());
<span class="kw">let </span>notify2 = notify.clone();
<span class="kw">let </span>handle = tokio::spawn(<span class="kw">async move </span>{
notify2.notified().<span class="kw">await</span>;
<span class="macro">println!</span>(<span class="string">"received notification"</span>);
});
<span class="macro">println!</span>(<span class="string">"sending notification"</span>);
notify.notify_one();
<span class="comment">// Wait for task to receive notification.
</span>handle.<span class="kw">await</span>.unwrap();</code></pre></div>
<p>Unbound multi-producer single-consumer (mpsc) channel.</p>
<p>No wakeups can be lost when using this channel because the call to
<code>notify_one()</code> will store a permit in the <code>Notify</code>, which the following call
to <code>notified()</code> will consume.</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>tokio::sync::Notify;
<span class="kw">use </span>std::collections::VecDeque;
<span class="kw">use </span>std::sync::Mutex;
<span class="kw">struct </span>Channel&lt;T&gt; {
values: Mutex&lt;VecDeque&lt;T&gt;&gt;,
notify: Notify,
}
<span class="kw">impl</span>&lt;T&gt; Channel&lt;T&gt; {
<span class="kw">pub fn </span>send(<span class="kw-2">&amp;</span><span class="self">self</span>, value: T) {
<span class="self">self</span>.values.lock().unwrap()
.push_back(value);
<span class="comment">// Notify the consumer a value is available
</span><span class="self">self</span>.notify.notify_one();
}
<span class="comment">// This is a single-consumer channel, so several concurrent calls to
// `recv` are not allowed.
</span><span class="kw">pub async fn </span>recv(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; T {
<span class="kw">loop </span>{
<span class="comment">// Drain values
</span><span class="kw">if let </span><span class="prelude-val">Some</span>(value) = <span class="self">self</span>.values.lock().unwrap().pop_front() {
<span class="kw">return </span>value;
}
<span class="comment">// Wait for values to be available
</span><span class="self">self</span>.notify.notified().<span class="kw">await</span>;
}
}
}</code></pre></div>
<p>Unbound multi-producer multi-consumer (mpmc) channel.</p>
<p>The call to <a href="futures/struct.Notified.html#method.enable" title="method tokio::sync::futures::Notified::enable"><code>enable</code></a> is important because otherwise if you have two
calls to <code>recv</code> and two calls to <code>send</code> in parallel, the following could
happen:</p>
<ol>
<li>Both calls to <code>try_recv</code> return <code>None</code>.</li>
<li>Both new elements are added to the vector.</li>
<li>The <code>notify_one</code> method is called twice, adding only a single
permit to the <code>Notify</code>.</li>
<li>Both calls to <code>recv</code> reach the <code>Notified</code> future. One of them
consumes the permit, and the other sleeps forever.</li>
</ol>
<p>By adding the <code>Notified</code> futures to the list by calling <code>enable</code> before
<code>try_recv</code>, the <code>notify_one</code> calls in step three would remove the
futures from the list and mark them notified instead of adding a permit
to the <code>Notify</code>. This ensures that both futures are woken.</p>
<p>Notice that this failure can only happen if there are two concurrent calls
to <code>recv</code>. This is why the mpsc example above does not require a call to
<code>enable</code>.</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>tokio::sync::Notify;
<span class="kw">use </span>std::collections::VecDeque;
<span class="kw">use </span>std::sync::Mutex;
<span class="kw">struct </span>Channel&lt;T&gt; {
messages: Mutex&lt;VecDeque&lt;T&gt;&gt;,
notify_on_sent: Notify,
}
<span class="kw">impl</span>&lt;T&gt; Channel&lt;T&gt; {
<span class="kw">pub fn </span>send(<span class="kw-2">&amp;</span><span class="self">self</span>, msg: T) {
<span class="kw">let </span><span class="kw-2">mut </span>locked_queue = <span class="self">self</span>.messages.lock().unwrap();
locked_queue.push_back(msg);
drop(locked_queue);
<span class="comment">// Send a notification to one of the calls currently
// waiting in a call to `recv`.
</span><span class="self">self</span>.notify_on_sent.notify_one();
}
<span class="kw">pub fn </span>try_recv(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; <span class="prelude-ty">Option</span>&lt;T&gt; {
<span class="kw">let </span><span class="kw-2">mut </span>locked_queue = <span class="self">self</span>.messages.lock().unwrap();
locked_queue.pop_front()
}
<span class="kw">pub async fn </span>recv(<span class="kw-2">&amp;</span><span class="self">self</span>) -&gt; T {
<span class="kw">let </span>future = <span class="self">self</span>.notify_on_sent.notified();
<span class="macro">tokio::pin!</span>(future);
<span class="kw">loop </span>{
<span class="comment">// Make sure that no wakeup is lost if we get
// `None` from `try_recv`.
</span>future.as_mut().enable();
<span class="kw">if let </span><span class="prelude-val">Some</span>(msg) = <span class="self">self</span>.try_recv() {
<span class="kw">return </span>msg;
}
<span class="comment">// Wait for a call to `notify_one`.
//
// This uses `.as_mut()` to avoid consuming the future,
// which lets us call `Pin::set` below.
</span>future.as_mut().<span class="kw">await</span>;
<span class="comment">// Reset the future in case another call to
// `try_recv` got the message before us.
</span>future.set(<span class="self">self</span>.notify_on_sent.notified());
}
}
}</code></pre></div></div></details><h2 id="implementations" class="section-header">Implementations<a href="#implementations" class="anchor">§</a></h2><div id="implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Notify" class="impl"><a class="src rightside" href="../../src/tokio/sync/notify.rs.html#473-833">Source</a><a href="#impl-Notify" class="anchor">§</a><h3 class="code-header">impl <a class="struct" href="struct.Notify.html" title="struct tokio::sync::Notify">Notify</a></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.new" class="method"><a class="src rightside" href="../../src/tokio/sync/notify.rs.html#483-488">Source</a><h4 class="code-header">pub fn <a href="#method.new" class="fn">new</a>() -&gt; <a class="struct" href="struct.Notify.html" title="struct tokio::sync::Notify">Notify</a></h4></section></summary><div class="docblock"><p>Create a new <code>Notify</code>, initialized without a permit.</p>
<h5 id="examples-1"><a class="doc-anchor" href="#examples-1">§</a>Examples</h5>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>tokio::sync::Notify;
<span class="kw">let </span>notify = Notify::new();</code></pre></div></div></details><details class="toggle method-toggle" open><summary><section id="method.const_new" class="method"><a class="src rightside" href="../../src/tokio/sync/notify.rs.html#508-513">Source</a><h4 class="code-header">pub const fn <a href="#method.const_new" class="fn">const_new</a>() -&gt; <a class="struct" href="struct.Notify.html" title="struct tokio::sync::Notify">Notify</a></h4></section></summary><div class="docblock"><p>Create a new <code>Notify</code>, initialized without a permit.</p>
<p>When using the <code>tracing</code> <a href="../index.html#unstable-features" title="mod tokio">unstable feature</a>, a <code>Notify</code> created with
<code>const_new</code> will not be instrumented. As such, it will not be visible
in <a href="https://github.com/tokio-rs/console"><code>tokio-console</code></a>. Instead, <a href="struct.Notify.html#method.new" title="associated function tokio::sync::Notify::new"><code>Notify::new</code></a> should be used to create
an instrumented object if that is needed.</p>
<h5 id="examples-2"><a class="doc-anchor" href="#examples-2">§</a>Examples</h5>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>tokio::sync::Notify;
<span class="kw">static </span>NOTIFY: Notify = Notify::const_new();</code></pre></div></div></details><details class="toggle method-toggle" open><summary><section id="method.notified" class="method"><a class="src rightside" href="../../src/tokio/sync/notify.rs.html#565-575">Source</a><h4 class="code-header">pub fn <a href="#method.notified" class="fn">notified</a>(&amp;self) -&gt; <a class="struct" href="futures/struct.Notified.html" title="struct tokio::sync::futures::Notified">Notified</a>&lt;'_&gt; <a href="#" class="tooltip" data-notable-ty="Notified&lt;&#39;_&gt;"></a></h4></section></summary><div class="docblock"><p>Wait for a notification.</p>
<p>Equivalent to:</p>
<div class="example-wrap ignore"><a href="#" class="tooltip" title="This example is not tested"></a><pre class="rust rust-example-rendered"><code><span class="kw">async fn </span>notified(<span class="kw-2">&amp;</span><span class="self">self</span>);</code></pre></div>
<p>Each <code>Notify</code> value holds a single permit. If a permit is available from
an earlier call to <a href="struct.Notify.html#method.notify_one" title="method tokio::sync::Notify::notify_one"><code>notify_one()</code></a>, then <code>notified().await</code> will complete
immediately, consuming that permit. Otherwise, <code>notified().await</code> waits
for a permit to be made available by the next call to <code>notify_one()</code>.</p>
<p>The <code>Notified</code> future is not guaranteed to receive wakeups from calls to
<code>notify_one()</code> if it has not yet been polled. See the documentation for
<a href="futures/struct.Notified.html#method.enable" title="method tokio::sync::futures::Notified::enable"><code>Notified::enable()</code></a> for more details.</p>
<p>The <code>Notified</code> future is guaranteed to receive wakeups from
<code>notify_waiters()</code> as soon as it has been created, even if it has not
yet been polled.</p>
<h5 id="cancel-safety"><a class="doc-anchor" href="#cancel-safety">§</a>Cancel safety</h5>
<p>This method uses a queue to fairly distribute notifications in the order
they were requested. Cancelling a call to <code>notified</code> makes you lose your
place in the queue.</p>
<h5 id="examples-3"><a class="doc-anchor" href="#examples-3">§</a>Examples</h5>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>tokio::sync::Notify;
<span class="kw">use </span>std::sync::Arc;
<span class="kw">let </span>notify = Arc::new(Notify::new());
<span class="kw">let </span>notify2 = notify.clone();
tokio::spawn(<span class="kw">async move </span>{
notify2.notified().<span class="kw">await</span>;
<span class="macro">println!</span>(<span class="string">"received notification"</span>);
});
<span class="macro">println!</span>(<span class="string">"sending notification"</span>);
notify.notify_one();</code></pre></div></div></details><details class="toggle method-toggle" open><summary><section id="method.notified_owned" class="method"><a class="src rightside" href="../../src/tokio/sync/notify.rs.html#613-623">Source</a><h4 class="code-header">pub fn <a href="#method.notified_owned" class="fn">notified_owned</a>(self: <a class="struct" href="https://doc.rust-lang.org/1.93.1/alloc/sync/struct.Arc.html" title="struct alloc::sync::Arc">Arc</a>&lt;Self&gt;) -&gt; <a class="struct" href="futures/struct.OwnedNotified.html" title="struct tokio::sync::futures::OwnedNotified">OwnedNotified</a> <a href="#" class="tooltip" data-notable-ty="OwnedNotified"></a></h4></section></summary><div class="docblock"><p>Wait for a notification with an owned <code>Future</code>.</p>
<p>Unlike <a href="struct.Notify.html#method.notified" title="method tokio::sync::Notify::notified"><code>Self::notified</code></a> which returns a future tied to the <code>Notify</code>s
lifetime, <code>notified_owned</code> creates a self-contained future that owns its
notification state, making it safe to move between threads.</p>
<p>See <a href="struct.Notify.html#method.notified" title="method tokio::sync::Notify::notified"><code>Self::notified</code></a> for more details.</p>
<h5 id="cancel-safety-1"><a class="doc-anchor" href="#cancel-safety-1">§</a>Cancel safety</h5>
<p>This method uses a queue to fairly distribute notifications in the order
they were requested. Cancelling a call to <code>notified_owned</code> makes you lose your
place in the queue.</p>
<h5 id="examples-4"><a class="doc-anchor" href="#examples-4">§</a>Examples</h5>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>std::sync::Arc;
<span class="kw">use </span>tokio::sync::Notify;
<span class="kw">let </span>notify = Arc::new(Notify::new());
<span class="kw">for _ in </span><span class="number">0</span>..<span class="number">10 </span>{
<span class="kw">let </span>notified = notify.clone().notified_owned();
tokio::spawn(<span class="kw">async move </span>{
notified.<span class="kw">await</span>;
<span class="macro">println!</span>(<span class="string">"received notification"</span>);
});
}
<span class="macro">println!</span>(<span class="string">"sending notification"</span>);
notify.notify_waiters();</code></pre></div></div></details><details class="toggle method-toggle" open><summary><section id="method.notify_one" class="method"><a class="src rightside" href="../../src/tokio/sync/notify.rs.html#660-662">Source</a><h4 class="code-header">pub fn <a href="#method.notify_one" class="fn">notify_one</a>(&amp;self)</h4></section></summary><div class="docblock"><p>Notifies the first waiting task.</p>
<p>If a task is currently waiting, that task is notified. Otherwise, a
permit is stored in this <code>Notify</code> value and the <strong>next</strong> call to
<a href="struct.Notify.html#method.notified" title="method tokio::sync::Notify::notified"><code>notified().await</code></a> will complete immediately consuming the permit made
available by this call to <code>notify_one()</code>.</p>
<p>At most one permit may be stored by <code>Notify</code>. Many sequential calls to
<code>notify_one</code> will result in a single permit being stored. The next call to
<code>notified().await</code> will complete immediately, but the one after that
will wait.</p>
<h5 id="examples-5"><a class="doc-anchor" href="#examples-5">§</a>Examples</h5>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>tokio::sync::Notify;
<span class="kw">use </span>std::sync::Arc;
<span class="kw">let </span>notify = Arc::new(Notify::new());
<span class="kw">let </span>notify2 = notify.clone();
tokio::spawn(<span class="kw">async move </span>{
notify2.notified().<span class="kw">await</span>;
<span class="macro">println!</span>(<span class="string">"received notification"</span>);
});
<span class="macro">println!</span>(<span class="string">"sending notification"</span>);
notify.notify_one();</code></pre></div></div></details><details class="toggle method-toggle" open><summary><section id="method.notify_last" class="method"><a class="src rightside" href="../../src/tokio/sync/notify.rs.html#673-675">Source</a><h4 class="code-header">pub fn <a href="#method.notify_last" class="fn">notify_last</a>(&amp;self)</h4></section></summary><div class="docblock"><p>Notifies the last waiting task.</p>
<p>This function behaves similar to <code>notify_one</code>. The only difference is that it wakes
the most recently added waiter instead of the oldest waiter.</p>
<p>Check the <a href="struct.Notify.html#method.notify_one" title="method tokio::sync::Notify::notify_one"><code>notify_one()</code></a> documentation for more info and
examples.</p>
</div></details><details class="toggle method-toggle" open><summary><section id="method.notify_waiters" class="method"><a class="src rightside" href="../../src/tokio/sync/notify.rs.html#743-745">Source</a><h4 class="code-header">pub fn <a href="#method.notify_waiters" class="fn">notify_waiters</a>(&amp;self)</h4></section></summary><div class="docblock"><p>Notifies all waiting tasks.</p>
<p>If a task is currently waiting, that task is notified. Unlike with
<code>notify_one()</code>, no permit is stored to be used by the next call to
<code>notified().await</code>. The purpose of this method is to notify all
already registered waiters. Registering for notification is done by
acquiring an instance of the <code>Notified</code> future via calling <code>notified()</code>.</p>
<h5 id="examples-6"><a class="doc-anchor" href="#examples-6">§</a>Examples</h5>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>tokio::sync::Notify;
<span class="kw">use </span>std::sync::Arc;
<span class="kw">let </span>notify = Arc::new(Notify::new());
<span class="kw">let </span>notify2 = notify.clone();
<span class="kw">let </span>notified1 = notify.notified();
<span class="kw">let </span>notified2 = notify.notified();
<span class="kw">let </span>handle = tokio::spawn(<span class="kw">async move </span>{
<span class="macro">println!</span>(<span class="string">"sending notifications"</span>);
notify2.notify_waiters();
});
notified1.<span class="kw">await</span>;
notified2.<span class="kw">await</span>;
<span class="macro">println!</span>(<span class="string">"received notifications"</span>);</code></pre></div></div></details></div></details></div><h2 id="trait-implementations" class="section-header">Trait Implementations<a href="#trait-implementations" class="anchor">§</a></h2><div id="trait-implementations-list"><details class="toggle implementors-toggle" open><summary><section id="impl-Debug-for-Notify" class="impl"><a class="src rightside" href="../../src/tokio/sync/notify.rs.html#201">Source</a><a href="#impl-Debug-for-Notify" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/1.93.1/core/fmt/trait.Debug.html" title="trait core::fmt::Debug">Debug</a> for <a class="struct" href="struct.Notify.html" title="struct tokio::sync::Notify">Notify</a></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.fmt" class="method trait-impl"><a class="src rightside" href="../../src/tokio/sync/notify.rs.html#201">Source</a><a href="#method.fmt" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/1.93.1/core/fmt/trait.Debug.html#tymethod.fmt" class="fn">fmt</a>(&amp;self, f: &amp;mut <a class="struct" href="https://doc.rust-lang.org/1.93.1/core/fmt/struct.Formatter.html" title="struct core::fmt::Formatter">Formatter</a>&lt;'_&gt;) -&gt; <a class="type" href="https://doc.rust-lang.org/1.93.1/core/fmt/type.Result.html" title="type core::fmt::Result">Result</a></h4></section></summary><div class='docblock'>Formats the value using the given formatter. <a href="https://doc.rust-lang.org/1.93.1/core/fmt/trait.Debug.html#tymethod.fmt">Read more</a></div></details></div></details><details class="toggle implementors-toggle" open><summary><section id="impl-Default-for-Notify" class="impl"><a class="src rightside" href="../../src/tokio/sync/notify.rs.html#835-839">Source</a><a href="#impl-Default-for-Notify" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/1.93.1/core/default/trait.Default.html" title="trait core::default::Default">Default</a> for <a class="struct" href="struct.Notify.html" title="struct tokio::sync::Notify">Notify</a></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.default" class="method trait-impl"><a class="src rightside" href="../../src/tokio/sync/notify.rs.html#836-838">Source</a><a href="#method.default" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/1.93.1/core/default/trait.Default.html#tymethod.default" class="fn">default</a>() -&gt; <a class="struct" href="struct.Notify.html" title="struct tokio::sync::Notify">Notify</a></h4></section></summary><div class='docblock'>Returns the “default value” for a type. <a href="https://doc.rust-lang.org/1.93.1/core/default/trait.Default.html#tymethod.default">Read more</a></div></details></div></details><section id="impl-RefUnwindSafe-for-Notify" class="impl"><a class="src rightside" href="../../src/tokio/sync/notify.rs.html#842">Source</a><a href="#impl-RefUnwindSafe-for-Notify" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/1.93.1/core/panic/unwind_safe/trait.RefUnwindSafe.html" title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a> for <a class="struct" href="struct.Notify.html" title="struct tokio::sync::Notify">Notify</a></h3></section><section id="impl-UnwindSafe-for-Notify" class="impl"><a class="src rightside" href="../../src/tokio/sync/notify.rs.html#841">Source</a><a href="#impl-UnwindSafe-for-Notify" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/1.93.1/core/panic/unwind_safe/trait.UnwindSafe.html" title="trait core::panic::unwind_safe::UnwindSafe">UnwindSafe</a> for <a class="struct" href="struct.Notify.html" title="struct tokio::sync::Notify">Notify</a></h3></section></div><h2 id="synthetic-implementations" class="section-header">Auto Trait Implementations<a href="#synthetic-implementations" class="anchor">§</a></h2><div id="synthetic-implementations-list"><section id="impl-Freeze-for-Notify" class="impl"><a href="#impl-Freeze-for-Notify" class="anchor">§</a><h3 class="code-header">impl !<a class="trait" href="https://doc.rust-lang.org/1.93.1/core/marker/trait.Freeze.html" title="trait core::marker::Freeze">Freeze</a> for <a class="struct" href="struct.Notify.html" title="struct tokio::sync::Notify">Notify</a></h3></section><section id="impl-Send-for-Notify" class="impl"><a href="#impl-Send-for-Notify" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/1.93.1/core/marker/trait.Send.html" title="trait core::marker::Send">Send</a> for <a class="struct" href="struct.Notify.html" title="struct tokio::sync::Notify">Notify</a></h3></section><section id="impl-Sync-for-Notify" class="impl"><a href="#impl-Sync-for-Notify" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/1.93.1/core/marker/trait.Sync.html" title="trait core::marker::Sync">Sync</a> for <a class="struct" href="struct.Notify.html" title="struct tokio::sync::Notify">Notify</a></h3></section><section id="impl-Unpin-for-Notify" class="impl"><a href="#impl-Unpin-for-Notify" class="anchor">§</a><h3 class="code-header">impl <a class="trait" href="https://doc.rust-lang.org/1.93.1/core/marker/trait.Unpin.html" title="trait core::marker::Unpin">Unpin</a> for <a class="struct" href="struct.Notify.html" title="struct tokio::sync::Notify">Notify</a></h3></section></div><h2 id="blanket-implementations" class="section-header">Blanket Implementations<a href="#blanket-implementations" class="anchor">§</a></h2><div id="blanket-implementations-list"><details class="toggle implementors-toggle"><summary><section id="impl-Any-for-T" class="impl"><a class="src rightside" href="https://doc.rust-lang.org/1.93.1/src/core/any.rs.html#138">Source</a><a href="#impl-Any-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://doc.rust-lang.org/1.93.1/core/any/trait.Any.html" title="trait core::any::Any">Any</a> for T<div class="where">where
T: 'static + ?<a class="trait" href="https://doc.rust-lang.org/1.93.1/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/1.93.1/src/core/any.rs.html#139">Source</a><a href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/1.93.1/core/any/trait.Any.html#tymethod.type_id" class="fn">type_id</a>(&amp;self) -&gt; <a class="struct" href="https://doc.rust-lang.org/1.93.1/core/any/struct.TypeId.html" title="struct core::any::TypeId">TypeId</a></h4></section></summary><div class='docblock'>Gets the <code>TypeId</code> of <code>self</code>. <a href="https://doc.rust-lang.org/1.93.1/core/any/trait.Any.html#tymethod.type_id">Read more</a></div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Borrow%3CT%3E-for-T" class="impl"><a class="src rightside" href="https://doc.rust-lang.org/1.93.1/src/core/borrow.rs.html#212">Source</a><a href="#impl-Borrow%3CT%3E-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://doc.rust-lang.org/1.93.1/core/borrow/trait.Borrow.html" title="trait core::borrow::Borrow">Borrow</a>&lt;T&gt; for T<div class="where">where
T: ?<a class="trait" href="https://doc.rust-lang.org/1.93.1/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/1.93.1/src/core/borrow.rs.html#214">Source</a><a href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/1.93.1/core/borrow/trait.Borrow.html#tymethod.borrow" class="fn">borrow</a>(&amp;self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.93.1/std/primitive.reference.html">&amp;T</a></h4></section></summary><div class='docblock'>Immutably borrows from an owned value. <a href="https://doc.rust-lang.org/1.93.1/core/borrow/trait.Borrow.html#tymethod.borrow">Read more</a></div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-BorrowMut%3CT%3E-for-T" class="impl"><a class="src rightside" href="https://doc.rust-lang.org/1.93.1/src/core/borrow.rs.html#221">Source</a><a href="#impl-BorrowMut%3CT%3E-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://doc.rust-lang.org/1.93.1/core/borrow/trait.BorrowMut.html" title="trait core::borrow::BorrowMut">BorrowMut</a>&lt;T&gt; for T<div class="where">where
T: ?<a class="trait" href="https://doc.rust-lang.org/1.93.1/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/1.93.1/src/core/borrow.rs.html#222">Source</a><a href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/1.93.1/core/borrow/trait.BorrowMut.html#tymethod.borrow_mut" class="fn">borrow_mut</a>(&amp;mut self) -&gt; <a class="primitive" href="https://doc.rust-lang.org/1.93.1/std/primitive.reference.html">&amp;mut T</a></h4></section></summary><div class='docblock'>Mutably borrows from an owned value. <a href="https://doc.rust-lang.org/1.93.1/core/borrow/trait.BorrowMut.html#tymethod.borrow_mut">Read more</a></div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-From%3CT%3E-for-T" class="impl"><a class="src rightside" href="https://doc.rust-lang.org/1.93.1/src/core/convert/mod.rs.html#785">Source</a><a href="#impl-From%3CT%3E-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T&gt; <a class="trait" href="https://doc.rust-lang.org/1.93.1/core/convert/trait.From.html" title="trait core::convert::From">From</a>&lt;T&gt; for T</h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.from" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/1.93.1/src/core/convert/mod.rs.html#788">Source</a><a href="#method.from" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/1.93.1/core/convert/trait.From.html#tymethod.from" class="fn">from</a>(t: T) -&gt; T</h4></section></summary><div class="docblock"><p>Returns the argument unchanged.</p>
</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-Into%3CU%3E-for-T" class="impl"><a class="src rightside" href="https://doc.rust-lang.org/1.93.1/src/core/convert/mod.rs.html#767-769">Source</a><a href="#impl-Into%3CU%3E-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T, U&gt; <a class="trait" href="https://doc.rust-lang.org/1.93.1/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a>&lt;U&gt; for T<div class="where">where
U: <a class="trait" href="https://doc.rust-lang.org/1.93.1/core/convert/trait.From.html" title="trait core::convert::From">From</a>&lt;T&gt;,</div></h3></section></summary><div class="impl-items"><details class="toggle method-toggle" open><summary><section id="method.into" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/1.93.1/src/core/convert/mod.rs.html#777">Source</a><a href="#method.into" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/1.93.1/core/convert/trait.Into.html#tymethod.into" class="fn">into</a>(self) -&gt; U</h4></section></summary><div class="docblock"><p>Calls <code>U::from(self)</code>.</p>
<p>That is, this conversion is whatever the implementation of
<code><a href="https://doc.rust-lang.org/1.93.1/core/convert/trait.From.html" title="trait core::convert::From">From</a>&lt;T&gt; for U</code> chooses to do.</p>
</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-TryFrom%3CU%3E-for-T" class="impl"><a class="src rightside" href="https://doc.rust-lang.org/1.93.1/src/core/convert/mod.rs.html#827-829">Source</a><a href="#impl-TryFrom%3CU%3E-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T, U&gt; <a class="trait" href="https://doc.rust-lang.org/1.93.1/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a>&lt;U&gt; for T<div class="where">where
U: <a class="trait" href="https://doc.rust-lang.org/1.93.1/core/convert/trait.Into.html" title="trait core::convert::Into">Into</a>&lt;T&gt;,</div></h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedtype.Error-1" class="associatedtype trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/1.93.1/src/core/convert/mod.rs.html#831">Source</a><a href="#associatedtype.Error-1" class="anchor">§</a><h4 class="code-header">type <a href="https://doc.rust-lang.org/1.93.1/core/convert/trait.TryFrom.html#associatedtype.Error" class="associatedtype">Error</a> = <a class="enum" href="https://doc.rust-lang.org/1.93.1/core/convert/enum.Infallible.html" title="enum core::convert::Infallible">Infallible</a></h4></section></summary><div class='docblock'>The type returned in the event of a conversion error.</div></details><details class="toggle method-toggle" open><summary><section id="method.try_from" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/1.93.1/src/core/convert/mod.rs.html#834">Source</a><a href="#method.try_from" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/1.93.1/core/convert/trait.TryFrom.html#tymethod.try_from" class="fn">try_from</a>(value: U) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.93.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;T, &lt;T as <a class="trait" href="https://doc.rust-lang.org/1.93.1/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a>&lt;U&gt;&gt;::<a class="associatedtype" href="https://doc.rust-lang.org/1.93.1/core/convert/trait.TryFrom.html#associatedtype.Error" title="type core::convert::TryFrom::Error">Error</a>&gt;</h4></section></summary><div class='docblock'>Performs the conversion.</div></details></div></details><details class="toggle implementors-toggle"><summary><section id="impl-TryInto%3CU%3E-for-T" class="impl"><a class="src rightside" href="https://doc.rust-lang.org/1.93.1/src/core/convert/mod.rs.html#811-813">Source</a><a href="#impl-TryInto%3CU%3E-for-T" class="anchor">§</a><h3 class="code-header">impl&lt;T, U&gt; <a class="trait" href="https://doc.rust-lang.org/1.93.1/core/convert/trait.TryInto.html" title="trait core::convert::TryInto">TryInto</a>&lt;U&gt; for T<div class="where">where
U: <a class="trait" href="https://doc.rust-lang.org/1.93.1/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a>&lt;T&gt;,</div></h3></section></summary><div class="impl-items"><details class="toggle" open><summary><section id="associatedtype.Error" class="associatedtype trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/1.93.1/src/core/convert/mod.rs.html#815">Source</a><a href="#associatedtype.Error" class="anchor">§</a><h4 class="code-header">type <a href="https://doc.rust-lang.org/1.93.1/core/convert/trait.TryInto.html#associatedtype.Error" class="associatedtype">Error</a> = &lt;U as <a class="trait" href="https://doc.rust-lang.org/1.93.1/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a>&lt;T&gt;&gt;::<a class="associatedtype" href="https://doc.rust-lang.org/1.93.1/core/convert/trait.TryFrom.html#associatedtype.Error" title="type core::convert::TryFrom::Error">Error</a></h4></section></summary><div class='docblock'>The type returned in the event of a conversion error.</div></details><details class="toggle method-toggle" open><summary><section id="method.try_into" class="method trait-impl"><a class="src rightside" href="https://doc.rust-lang.org/1.93.1/src/core/convert/mod.rs.html#818">Source</a><a href="#method.try_into" class="anchor">§</a><h4 class="code-header">fn <a href="https://doc.rust-lang.org/1.93.1/core/convert/trait.TryInto.html#tymethod.try_into" class="fn">try_into</a>(self) -&gt; <a class="enum" href="https://doc.rust-lang.org/1.93.1/core/result/enum.Result.html" title="enum core::result::Result">Result</a>&lt;U, &lt;U as <a class="trait" href="https://doc.rust-lang.org/1.93.1/core/convert/trait.TryFrom.html" title="trait core::convert::TryFrom">TryFrom</a>&lt;T&gt;&gt;::<a class="associatedtype" href="https://doc.rust-lang.org/1.93.1/core/convert/trait.TryFrom.html#associatedtype.Error" title="type core::convert::TryFrom::Error">Error</a>&gt;</h4></section></summary><div class='docblock'>Performs the conversion.</div></details></div></details></div><script type="text/json" id="notable-traits-data">{"Notified<'_>":"<h3>Notable traits for <code><a class=\"struct\" href=\"futures/struct.Notified.html\" title=\"struct tokio::sync::futures::Notified\">Notified</a>&lt;'_&gt;</code></h3><pre><code><div class=\"where\">impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.93.1/core/future/future/trait.Future.html\" title=\"trait core::future::future::Future\">Future</a> for <a class=\"struct\" href=\"futures/struct.Notified.html\" title=\"struct tokio::sync::futures::Notified\">Notified</a>&lt;'_&gt;</div><div class=\"where\"> type <a href=\"https://doc.rust-lang.org/1.93.1/core/future/future/trait.Future.html#associatedtype.Output\" class=\"associatedtype\">Output</a> = <a class=\"primitive\" href=\"https://doc.rust-lang.org/1.93.1/std/primitive.unit.html\">()</a>;</div>","OwnedNotified":"<h3>Notable traits for <code><a class=\"struct\" href=\"futures/struct.OwnedNotified.html\" title=\"struct tokio::sync::futures::OwnedNotified\">OwnedNotified</a></code></h3><pre><code><div class=\"where\">impl <a class=\"trait\" href=\"https://doc.rust-lang.org/1.93.1/core/future/future/trait.Future.html\" title=\"trait core::future::future::Future\">Future</a> for <a class=\"struct\" href=\"futures/struct.OwnedNotified.html\" title=\"struct tokio::sync::futures::OwnedNotified\">OwnedNotified</a></div><div class=\"where\"> type <a href=\"https://doc.rust-lang.org/1.93.1/core/future/future/trait.Future.html#associatedtype.Output\" class=\"associatedtype\">Output</a> = <a class=\"primitive\" href=\"https://doc.rust-lang.org/1.93.1/std/primitive.unit.html\">()</a>;</div>"}</script></section></div></main></body></html>