| <!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="An asynchronous `Mutex`-like type."><meta name="keywords" content="rust, rustlang, rust-lang, Mutex"><title>Mutex in tokio::sync - Rust</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceSerif4-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../FiraSans-Regular.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../FiraSans-Medium.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceCodePro-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceSerif4-Bold.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceCodePro-Semibold.ttf.woff2"><link rel="stylesheet" href="../../normalize.css"><link rel="stylesheet" href="../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" href="../../ayu.css" disabled><link rel="stylesheet" href="../../dark.css" disabled><link rel="stylesheet" href="../../light.css" id="themeStyle"><script id="default-settings" ></script><script src="../../storage.js"></script><script defer src="sidebar-items.js"></script><script defer src="../../main.js"></script><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="alternate icon" type="image/png" href="../../favicon-16x16.png"><link rel="alternate icon" type="image/png" href="../../favicon-32x32.png"><link rel="icon" type="image/svg+xml" href="../../favicon.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]--><nav class="mobile-topbar"><button class="sidebar-menu-toggle">☰</button><a class="sidebar-logo" href="../../tokio/index.html"><div class="logo-container"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></div></a><h2></h2></nav><nav class="sidebar"><a class="sidebar-logo" href="../../tokio/index.html"><div class="logo-container"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></div></a><h2 class="location"><a href="#">Mutex</a></h2><div class="sidebar-elems"><section><h3><a href="#implementations">Methods</a></h3><ul class="block"><li><a href="#method.blocking_lock">blocking_lock</a></li><li><a href="#method.blocking_lock_owned">blocking_lock_owned</a></li><li><a href="#method.get_mut">get_mut</a></li><li><a href="#method.into_inner">into_inner</a></li><li><a href="#method.lock">lock</a></li><li><a href="#method.lock_owned">lock_owned</a></li><li><a href="#method.new">new</a></li><li><a href="#method.try_lock">try_lock</a></li><li><a href="#method.try_lock_owned">try_lock_owned</a></li></ul><h3><a href="#trait-implementations">Trait Implementations</a></h3><ul class="block"><li><a href="#impl-Debug-for-Mutex%3CT%3E">Debug</a></li><li><a href="#impl-Default-for-Mutex%3CT%3E">Default</a></li><li><a href="#impl-From%3CT%3E-for-Mutex%3CT%3E">From<T></a></li><li><a href="#impl-Send-for-Mutex%3CT%3E">Send</a></li><li><a href="#impl-Sync-for-Mutex%3CT%3E">Sync</a></li></ul><h3><a href="#synthetic-implementations">Auto Trait Implementations</a></h3><ul class="block"><li><a href="#impl-RefUnwindSafe-for-Mutex%3CT%3E">!RefUnwindSafe</a></li><li><a href="#impl-Unpin-for-Mutex%3CT%3E">Unpin</a></li><li><a href="#impl-UnwindSafe-for-Mutex%3CT%3E">UnwindSafe</a></li></ul><h3><a href="#blanket-implementations">Blanket Implementations</a></h3><ul class="block"><li><a href="#impl-Any-for-Mutex%3CT%3E">Any</a></li><li><a href="#impl-Borrow%3CT%3E-for-Mutex%3CT%3E">Borrow<T></a></li><li><a href="#impl-BorrowMut%3CT%3E-for-Mutex%3CT%3E">BorrowMut<T></a></li><li><a href="#impl-From%3C!%3E-for-Mutex%3CT%3E">From<!></a></li><li><a href="#impl-From%3CT%3E-for-Mutex%3CT%3E-1">From<T></a></li><li><a href="#impl-Into%3CU%3E-for-Mutex%3CT%3E">Into<U></a></li><li><a href="#impl-TryFrom%3CU%3E-for-Mutex%3CT%3E">TryFrom<U></a></li><li><a href="#impl-TryInto%3CU%3E-for-Mutex%3CT%3E">TryInto<U></a></li></ul></section><h2><a href="index.html">In tokio::sync</a></h2></div></nav><main><div class="width-limiter"><nav class="sub"><form class="search-form"><div class="search-container"><span></span><input class="search-input" name="search" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" title="help" tabindex="-1"><a href="../../help.html">?</a></div><div id="settings-menu" tabindex="-1"><a href="../../settings.html" title="settings"><img width="22" height="22" alt="Change settings" src="../../wheel.svg"></a></div></div></form></nav><section id="main-content" class="content"><div class="main-heading"><h1 class="fqn">Struct <a href="../index.html">tokio</a>::<wbr><a href="index.html">sync</a>::<wbr><a class="struct" href="#">Mutex</a><button id="copy-path" onclick="copy_path(this)" title="Copy item path to clipboard"><img src="../../clipboard.svg" width="19" height="18" alt="Copy item path"></button></h1><span class="out-of-band"><a class="srclink" href="../../src/tokio/sync/mutex.rs.html#128-133">source</a> · <a id="toggle-all-docs" href="javascript:void(0)" title="collapse all docs">[<span class="inner">−</span>]</a></span></div><div class="item-decl"><pre class="rust struct"><code>pub struct Mutex<T: ?Sized> { /* private fields */ }</code></pre></div><details class="rustdoc-toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>An asynchronous <code>Mutex</code>-like type.</p> |
| <p>This type acts similarly to <a href="struct@std::sync::Mutex"><code>std::sync::Mutex</code></a>, with two major |
| differences: <a href="struct.Mutex.html#method.lock"><code>lock</code></a> is an async method so does not block, and the lock |
| guard is designed to be held across <code>.await</code> points.</p> |
| <h2 id="which-kind-of-mutex-should-you-use"><a href="#which-kind-of-mutex-should-you-use">Which kind of mutex should you use?</a></h2> |
| <p>Contrary to popular belief, it is ok and often preferred to use the ordinary |
| <a href="std::sync::Mutex"><code>Mutex</code></a> from the standard library in asynchronous code.</p> |
| <p>The feature that the async mutex offers over the blocking mutex is the |
| ability to keep it locked across an <code>.await</code> point. This makes the async |
| mutex more expensive than the blocking mutex, so the blocking mutex should |
| be preferred in the cases where it can be used. The primary use case for the |
| async mutex is to provide shared mutable access to IO resources such as a |
| database connection. If the value behind the mutex is just data, it’s |
| usually appropriate to use a blocking mutex such as the one in the standard |
| library or <a href="https://docs.rs/parking_lot"><code>parking_lot</code></a>.</p> |
| <p>Note that, although the compiler will not prevent the std <code>Mutex</code> from holding |
| its guard across <code>.await</code> points in situations where the task is not movable |
| between threads, this virtually never leads to correct concurrent code in |
| practice as it can easily lead to deadlocks.</p> |
| <p>A common pattern is to wrap the <code>Arc<Mutex<...>></code> in a struct that provides |
| non-async methods for performing operations on the data within, and only |
| lock the mutex inside these methods. The <a href="https://github.com/tokio-rs/mini-redis/blob/master/src/db.rs">mini-redis</a> example provides an |
| illustration of this pattern.</p> |
| <p>Additionally, when you <em>do</em> want shared access to an IO resource, it is |
| often better to spawn a task to manage the IO resource, and to use message |
| passing to communicate with that task.</p> |
| <h2 id="examples"><a href="#examples">Examples:</a></h2> |
| <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>tokio::sync::Mutex; |
| <span class="kw">use </span>std::sync::Arc; |
| |
| <span class="attribute">#[tokio::main] |
| </span><span class="kw">async fn </span>main() { |
| <span class="kw">let </span>data1 = Arc::new(Mutex::new(<span class="number">0</span>)); |
| <span class="kw">let </span>data2 = Arc::clone(<span class="kw-2">&</span>data1); |
| |
| tokio::spawn(<span class="kw">async move </span>{ |
| <span class="kw">let </span><span class="kw-2">mut </span>lock = data2.lock().<span class="kw">await</span>; |
| <span class="kw-2">*</span>lock += <span class="number">1</span>; |
| }); |
| |
| <span class="kw">let </span><span class="kw-2">mut </span>lock = data1.lock().<span class="kw">await</span>; |
| <span class="kw-2">*</span>lock += <span class="number">1</span>; |
| }</code></pre></div> |
| |
| <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>tokio::sync::Mutex; |
| <span class="kw">use </span>std::sync::Arc; |
| |
| <span class="attribute">#[tokio::main] |
| </span><span class="kw">async fn </span>main() { |
| <span class="kw">let </span>count = Arc::new(Mutex::new(<span class="number">0</span>)); |
| |
| <span class="kw">for </span>i <span class="kw">in </span><span class="number">0</span>..<span class="number">5 </span>{ |
| <span class="kw">let </span>my_count = Arc::clone(<span class="kw-2">&</span>count); |
| tokio::spawn(<span class="kw">async move </span>{ |
| <span class="kw">for </span>j <span class="kw">in </span><span class="number">0</span>..<span class="number">10 </span>{ |
| <span class="kw">let </span><span class="kw-2">mut </span>lock = my_count.lock().<span class="kw">await</span>; |
| <span class="kw-2">*</span>lock += <span class="number">1</span>; |
| <span class="macro">println!</span>(<span class="string">"{} {} {}"</span>, i, j, lock); |
| } |
| }); |
| } |
| |
| <span class="kw">loop </span>{ |
| <span class="kw">if </span><span class="kw-2">*</span>count.lock().<span class="kw">await </span>>= <span class="number">50 </span>{ |
| <span class="kw">break</span>; |
| } |
| } |
| <span class="macro">println!</span>(<span class="string">"Count hit 50."</span>); |
| }</code></pre></div> |
| <p>There are a few things of note here to pay attention to in this example.</p> |
| <ol> |
| <li>The mutex is wrapped in an <a href="struct@std::sync::Arc"><code>Arc</code></a> to allow it to be shared across |
| threads.</li> |
| <li>Each spawned task obtains a lock and releases it on every iteration.</li> |
| <li>Mutation of the data protected by the Mutex is done by de-referencing |
| the obtained lock as seen on lines 12 and 19.</li> |
| </ol> |
| <p>Tokio’s Mutex works in a simple FIFO (first in, first out) style where all |
| calls to <a href="struct.Mutex.html#method.lock"><code>lock</code></a> complete in the order they were performed. In that way the |
| Mutex is “fair” and predictable in how it distributes the locks to inner |
| data. Locks are released and reacquired after every iteration, so basically, |
| each thread goes to the back of the line after it increments the value once. |
| Note that there’s some unpredictability to the timing between when the |
| threads are started, but once they are going they alternate predictably. |
| Finally, since there is only a single valid lock at any given time, there is |
| no possibility of a race condition when mutating the inner value.</p> |
| <p>Note that in contrast to <a href="struct@std::sync::Mutex"><code>std::sync::Mutex</code></a>, this implementation does not |
| poison the mutex when a thread holding the <a href="struct.MutexGuard.html"><code>MutexGuard</code></a> panics. In such a |
| case, the mutex will be unlocked. If the panic is caught, this might leave |
| the data protected by the mutex in an inconsistent state.</p> |
| </div></details><h2 id="implementations" class="small-section-header">Implementations<a href="#implementations" class="anchor"></a></h2><div id="implementations-list"><details class="rustdoc-toggle implementors-toggle" open><summary><section id="impl-Mutex%3CT%3E" class="impl has-srclink"><a class="srclink rightside" href="../../src/tokio/sync/mutex.rs.html#244-679">source</a><a href="#impl-Mutex%3CT%3E" class="anchor"></a><h3 class="code-header">impl<T: ?Sized> <a class="struct" href="struct.Mutex.html" title="struct tokio::sync::Mutex">Mutex</a><T></h3></section></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><section id="method.new" class="method has-srclink"><a class="srclink rightside" href="../../src/tokio/sync/mutex.rs.html#255-291">source</a><h4 class="code-header">pub fn <a href="#method.new" class="fnname">new</a>(t: T) -> Self<span class="where fmt-newline">where<br> T: Sized,</span></h4></section></summary><div class="docblock"><p>Creates a new lock in an unlocked state ready for use.</p> |
| <h5 id="examples-1"><a href="#examples-1">Examples</a></h5> |
| <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>tokio::sync::Mutex; |
| |
| <span class="kw">let </span>lock = Mutex::new(<span class="number">5</span>);</code></pre></div> |
| </div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="method.lock" class="method has-srclink"><a class="srclink rightside" href="../../src/tokio/sync/mutex.rs.html#339-366">source</a><h4 class="code-header">pub async fn <a href="#method.lock" class="fnname">lock</a>(&self) -> <a class="struct" href="struct.MutexGuard.html" title="struct tokio::sync::MutexGuard">MutexGuard</a><'_, T></h4></section></summary><div class="docblock"><p>Locks this mutex, causing the current task to yield until the lock has |
| been acquired. When the lock has been acquired, function returns a |
| <a href="struct.MutexGuard.html" title="MutexGuard"><code>MutexGuard</code></a>.</p> |
| <h5 id="cancel-safety"><a href="#cancel-safety">Cancel safety</a></h5> |
| <p>This method uses a queue to fairly distribute locks in the order they |
| were requested. Cancelling a call to <code>lock</code> makes you lose your place in |
| the queue.</p> |
| <h5 id="examples-2"><a href="#examples-2">Examples</a></h5> |
| <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>tokio::sync::Mutex; |
| |
| <span class="attribute">#[tokio::main] |
| </span><span class="kw">async fn </span>main() { |
| <span class="kw">let </span>mutex = Mutex::new(<span class="number">1</span>); |
| |
| <span class="kw">let </span><span class="kw-2">mut </span>n = mutex.lock().<span class="kw">await</span>; |
| <span class="kw-2">*</span>n = <span class="number">2</span>; |
| }</code></pre></div> |
| </div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="method.blocking_lock" class="method has-srclink"><a class="srclink rightside" href="../../src/tokio/sync/mutex.rs.html#417-419">source</a><h4 class="code-header">pub fn <a href="#method.blocking_lock" class="fnname">blocking_lock</a>(&self) -> <a class="struct" href="struct.MutexGuard.html" title="struct tokio::sync::MutexGuard">MutexGuard</a><'_, T></h4></section></summary><div class="docblock"><p>Blockingly locks this <code>Mutex</code>. When the lock has been acquired, function returns a |
| <a href="struct.MutexGuard.html" title="MutexGuard"><code>MutexGuard</code></a>.</p> |
| <p>This method is intended for use cases where you |
| need to use this mutex in asynchronous code as well as in synchronous code.</p> |
| <h5 id="panics"><a href="#panics">Panics</a></h5> |
| <p>This function panics if called within an asynchronous execution context.</p> |
| <ul> |
| <li>If you find yourself in an asynchronous execution context and needing |
| to call some (synchronous) function which performs one of these |
| <code>blocking_</code> operations, then consider wrapping that call inside |
| <a href="../runtime/struct.Handle.html#method.spawn_blocking" title="crate::runtime::Handle::spawn_blocking"><code>spawn_blocking()</code></a> |
| (or <a href="../task/fn.block_in_place.html" title="crate::task::block_in_place"><code>block_in_place()</code></a>).</li> |
| </ul> |
| <h5 id="examples-3"><a href="#examples-3">Examples</a></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::Mutex; |
| |
| <span class="attribute">#[tokio::main] |
| </span><span class="kw">async fn </span>main() { |
| <span class="kw">let </span>mutex = Arc::new(Mutex::new(<span class="number">1</span>)); |
| <span class="kw">let </span>lock = mutex.lock().<span class="kw">await</span>; |
| |
| <span class="kw">let </span>mutex1 = Arc::clone(<span class="kw-2">&</span>mutex); |
| <span class="kw">let </span>blocking_task = tokio::task::spawn_blocking(<span class="kw">move </span>|| { |
| <span class="comment">// This shall block until the `lock` is released. |
| </span><span class="kw">let </span><span class="kw-2">mut </span>n = mutex1.blocking_lock(); |
| <span class="kw-2">*</span>n = <span class="number">2</span>; |
| }); |
| |
| <span class="macro">assert_eq!</span>(<span class="kw-2">*</span>lock, <span class="number">1</span>); |
| <span class="comment">// Release the lock. |
| </span>drop(lock); |
| |
| <span class="comment">// Await the completion of the blocking task. |
| </span>blocking_task.<span class="kw">await</span>.unwrap(); |
| |
| <span class="comment">// Assert uncontended. |
| </span><span class="kw">let </span>n = mutex.try_lock().unwrap(); |
| <span class="macro">assert_eq!</span>(<span class="kw-2">*</span>n, <span class="number">2</span>); |
| } |
| </code></pre></div> |
| </div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="method.blocking_lock_owned" class="method has-srclink"><a class="srclink rightside" href="../../src/tokio/sync/mutex.rs.html#473-475">source</a><h4 class="code-header">pub fn <a href="#method.blocking_lock_owned" class="fnname">blocking_lock_owned</a>(self: Arc<Self>) -> <a class="struct" href="struct.OwnedMutexGuard.html" title="struct tokio::sync::OwnedMutexGuard">OwnedMutexGuard</a><T></h4></section></summary><div class="docblock"><p>Blockingly locks this <code>Mutex</code>. When the lock has been acquired, function returns an |
| <a href="struct.OwnedMutexGuard.html" title="OwnedMutexGuard"><code>OwnedMutexGuard</code></a>.</p> |
| <p>This method is identical to <a href="struct.Mutex.html#method.blocking_lock" title="Mutex::blocking_lock"><code>Mutex::blocking_lock</code></a>, except that the returned |
| guard references the <code>Mutex</code> with an [<code>Arc</code>] rather than by borrowing |
| it. Therefore, the <code>Mutex</code> must be wrapped in an <code>Arc</code> to call this |
| method, and the guard will live for the <code>'static</code> lifetime, as it keeps |
| the <code>Mutex</code> alive by holding an <code>Arc</code>.</p> |
| <h5 id="panics-1"><a href="#panics-1">Panics</a></h5> |
| <p>This function panics if called within an asynchronous execution context.</p> |
| <ul> |
| <li>If you find yourself in an asynchronous execution context and needing |
| to call some (synchronous) function which performs one of these |
| <code>blocking_</code> operations, then consider wrapping that call inside |
| <a href="../runtime/struct.Handle.html#method.spawn_blocking" title="crate::runtime::Handle::spawn_blocking"><code>spawn_blocking()</code></a> |
| (or <a href="../task/fn.block_in_place.html" title="crate::task::block_in_place"><code>block_in_place()</code></a>).</li> |
| </ul> |
| <h5 id="examples-4"><a href="#examples-4">Examples</a></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::Mutex; |
| |
| <span class="attribute">#[tokio::main] |
| </span><span class="kw">async fn </span>main() { |
| <span class="kw">let </span>mutex = Arc::new(Mutex::new(<span class="number">1</span>)); |
| <span class="kw">let </span>lock = mutex.lock().<span class="kw">await</span>; |
| |
| <span class="kw">let </span>mutex1 = Arc::clone(<span class="kw-2">&</span>mutex); |
| <span class="kw">let </span>blocking_task = tokio::task::spawn_blocking(<span class="kw">move </span>|| { |
| <span class="comment">// This shall block until the `lock` is released. |
| </span><span class="kw">let </span><span class="kw-2">mut </span>n = mutex1.blocking_lock_owned(); |
| <span class="kw-2">*</span>n = <span class="number">2</span>; |
| }); |
| |
| <span class="macro">assert_eq!</span>(<span class="kw-2">*</span>lock, <span class="number">1</span>); |
| <span class="comment">// Release the lock. |
| </span>drop(lock); |
| |
| <span class="comment">// Await the completion of the blocking task. |
| </span>blocking_task.<span class="kw">await</span>.unwrap(); |
| |
| <span class="comment">// Assert uncontended. |
| </span><span class="kw">let </span>n = mutex.try_lock().unwrap(); |
| <span class="macro">assert_eq!</span>(<span class="kw-2">*</span>n, <span class="number">2</span>); |
| } |
| </code></pre></div> |
| </div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="method.lock_owned" class="method has-srclink"><a class="srclink rightside" href="../../src/tokio/sync/mutex.rs.html#509-539">source</a><h4 class="code-header">pub async fn <a href="#method.lock_owned" class="fnname">lock_owned</a>(self: Arc<Self>) -> <a class="struct" href="struct.OwnedMutexGuard.html" title="struct tokio::sync::OwnedMutexGuard">OwnedMutexGuard</a><T></h4></section></summary><div class="docblock"><p>Locks this mutex, causing the current task to yield until the lock has |
| been acquired. When the lock has been acquired, this returns an |
| <a href="struct.OwnedMutexGuard.html" title="OwnedMutexGuard"><code>OwnedMutexGuard</code></a>.</p> |
| <p>This method is identical to <a href="struct.Mutex.html#method.lock" title="Mutex::lock"><code>Mutex::lock</code></a>, except that the returned |
| guard references the <code>Mutex</code> with an <a href="std::sync::Arc"><code>Arc</code></a> rather than by borrowing |
| it. Therefore, the <code>Mutex</code> must be wrapped in an <code>Arc</code> to call this |
| method, and the guard will live for the <code>'static</code> lifetime, as it keeps |
| the <code>Mutex</code> alive by holding an <code>Arc</code>.</p> |
| <h5 id="cancel-safety-1"><a href="#cancel-safety-1">Cancel safety</a></h5> |
| <p>This method uses a queue to fairly distribute locks in the order they |
| were requested. Cancelling a call to <code>lock_owned</code> makes you lose your |
| place in the queue.</p> |
| <h5 id="examples-5"><a href="#examples-5">Examples</a></h5> |
| <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>tokio::sync::Mutex; |
| <span class="kw">use </span>std::sync::Arc; |
| |
| <span class="attribute">#[tokio::main] |
| </span><span class="kw">async fn </span>main() { |
| <span class="kw">let </span>mutex = Arc::new(Mutex::new(<span class="number">1</span>)); |
| |
| <span class="kw">let </span><span class="kw-2">mut </span>n = mutex.clone().lock_owned().<span class="kw">await</span>; |
| <span class="kw-2">*</span>n = <span class="number">2</span>; |
| }</code></pre></div> |
| </div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="method.try_lock" class="method has-srclink"><a class="srclink rightside" href="../../src/tokio/sync/mutex.rs.html#566-585">source</a><h4 class="code-header">pub fn <a href="#method.try_lock" class="fnname">try_lock</a>(&self) -> Result<<a class="struct" href="struct.MutexGuard.html" title="struct tokio::sync::MutexGuard">MutexGuard</a><'_, T>, <a class="struct" href="struct.TryLockError.html" title="struct tokio::sync::TryLockError">TryLockError</a>></h4></section></summary><div class="docblock"><p>Attempts to acquire the lock, and returns <a href="struct.TryLockError.html"><code>TryLockError</code></a> if the |
| lock is currently held somewhere else.</p> |
| <h5 id="examples-6"><a href="#examples-6">Examples</a></h5> |
| <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>tokio::sync::Mutex; |
| |
| <span class="kw">let </span>mutex = Mutex::new(<span class="number">1</span>); |
| |
| <span class="kw">let </span>n = mutex.try_lock()<span class="question-mark">?</span>; |
| <span class="macro">assert_eq!</span>(<span class="kw-2">*</span>n, <span class="number">1</span>);</code></pre></div> |
| </div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="method.get_mut" class="method has-srclink"><a class="srclink rightside" href="../../src/tokio/sync/mutex.rs.html#604-609">source</a><h4 class="code-header">pub fn <a href="#method.get_mut" class="fnname">get_mut</a>(&mut self) -> &mut T</h4></section></summary><div class="docblock"><p>Returns a mutable reference to the underlying data.</p> |
| <p>Since this call borrows the <code>Mutex</code> mutably, no actual locking needs to |
| take place – the mutable borrow statically guarantees no locks exist.</p> |
| <h5 id="examples-7"><a href="#examples-7">Examples</a></h5> |
| <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>tokio::sync::Mutex; |
| |
| <span class="kw">fn </span>main() { |
| <span class="kw">let </span><span class="kw-2">mut </span>mutex = Mutex::new(<span class="number">1</span>); |
| |
| <span class="kw">let </span>n = mutex.get_mut(); |
| <span class="kw-2">*</span>n = <span class="number">2</span>; |
| }</code></pre></div> |
| </div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="method.try_lock_owned" class="method has-srclink"><a class="srclink rightside" href="../../src/tokio/sync/mutex.rs.html#635-657">source</a><h4 class="code-header">pub fn <a href="#method.try_lock_owned" class="fnname">try_lock_owned</a>(<br> self: Arc<Self><br>) -> Result<<a class="struct" href="struct.OwnedMutexGuard.html" title="struct tokio::sync::OwnedMutexGuard">OwnedMutexGuard</a><T>, <a class="struct" href="struct.TryLockError.html" title="struct tokio::sync::TryLockError">TryLockError</a>></h4></section></summary><div class="docblock"><p>Attempts to acquire the lock, and returns <a href="struct.TryLockError.html"><code>TryLockError</code></a> if the lock |
| is currently held somewhere else.</p> |
| <p>This method is identical to <a href="struct.Mutex.html#method.try_lock" title="Mutex::try_lock"><code>Mutex::try_lock</code></a>, except that the |
| returned guard references the <code>Mutex</code> with an <a href="std::sync::Arc"><code>Arc</code></a> rather than by |
| borrowing it. Therefore, the <code>Mutex</code> must be wrapped in an <code>Arc</code> to call |
| this method, and the guard will live for the <code>'static</code> lifetime, as it |
| keeps the <code>Mutex</code> alive by holding an <code>Arc</code>.</p> |
| <h5 id="examples-8"><a href="#examples-8">Examples</a></h5> |
| <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>tokio::sync::Mutex; |
| <span class="kw">use </span>std::sync::Arc; |
| |
| <span class="kw">let </span>mutex = Arc::new(Mutex::new(<span class="number">1</span>)); |
| |
| <span class="kw">let </span>n = mutex.clone().try_lock_owned()<span class="question-mark">?</span>; |
| <span class="macro">assert_eq!</span>(<span class="kw-2">*</span>n, <span class="number">1</span>);</code></pre></div> |
| </div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="method.into_inner" class="method has-srclink"><a class="srclink rightside" href="../../src/tokio/sync/mutex.rs.html#673-678">source</a><h4 class="code-header">pub fn <a href="#method.into_inner" class="fnname">into_inner</a>(self) -> T<span class="where fmt-newline">where<br> T: Sized,</span></h4></section></summary><div class="docblock"><p>Consumes the mutex, returning the underlying data.</p> |
| <h5 id="examples-9"><a href="#examples-9">Examples</a></h5> |
| <div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="kw">use </span>tokio::sync::Mutex; |
| |
| <span class="attribute">#[tokio::main] |
| </span><span class="kw">async fn </span>main() { |
| <span class="kw">let </span>mutex = Mutex::new(<span class="number">1</span>); |
| |
| <span class="kw">let </span>n = mutex.into_inner(); |
| <span class="macro">assert_eq!</span>(n, <span class="number">1</span>); |
| }</code></pre></div> |
| </div></details></div></details></div><h2 id="trait-implementations" class="small-section-header">Trait Implementations<a href="#trait-implementations" class="anchor"></a></h2><div id="trait-implementations-list"><details class="rustdoc-toggle implementors-toggle" open><summary><section id="impl-Debug-for-Mutex%3CT%3E" class="impl has-srclink"><a class="srclink rightside" href="../../src/tokio/sync/mutex.rs.html#696-708">source</a><a href="#impl-Debug-for-Mutex%3CT%3E" class="anchor"></a><h3 class="code-header">impl<T: ?Sized> Debug for <a class="struct" href="struct.Mutex.html" title="struct tokio::sync::Mutex">Mutex</a><T><span class="where fmt-newline">where<br> T: Debug,</span></h3></section></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><section id="method.fmt" class="method trait-impl has-srclink"><a class="srclink rightside" href="../../src/tokio/sync/mutex.rs.html#700-707">source</a><a href="#method.fmt" class="anchor"></a><h4 class="code-header">fn <a class="fnname">fmt</a>(&self, f: &mut Formatter<'_>) -> Result</h4></section></summary><div class='docblock'>Formats the value using the given formatter. <a>Read more</a></div></details></div></details><details class="rustdoc-toggle implementors-toggle" open><summary><section id="impl-Default-for-Mutex%3CT%3E" class="impl has-srclink"><a class="srclink rightside" href="../../src/tokio/sync/mutex.rs.html#687-694">source</a><a href="#impl-Default-for-Mutex%3CT%3E" class="anchor"></a><h3 class="code-header">impl<T> Default for <a class="struct" href="struct.Mutex.html" title="struct tokio::sync::Mutex">Mutex</a><T><span class="where fmt-newline">where<br> T: Default,</span></h3></section></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><section id="method.default" class="method trait-impl has-srclink"><a class="srclink rightside" href="../../src/tokio/sync/mutex.rs.html#691-693">source</a><a href="#method.default" class="anchor"></a><h4 class="code-header">fn <a class="fnname">default</a>() -> Self</h4></section></summary><div class='docblock'>Returns the “default value” for a type. <a>Read more</a></div></details></div></details><details class="rustdoc-toggle implementors-toggle" open><summary><section id="impl-From%3CT%3E-for-Mutex%3CT%3E" class="impl has-srclink"><a class="srclink rightside" href="../../src/tokio/sync/mutex.rs.html#681-685">source</a><a href="#impl-From%3CT%3E-for-Mutex%3CT%3E" class="anchor"></a><h3 class="code-header">impl<T> From<T> for <a class="struct" href="struct.Mutex.html" title="struct tokio::sync::Mutex">Mutex</a><T></h3></section></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><section id="method.from" class="method trait-impl has-srclink"><a class="srclink rightside" href="../../src/tokio/sync/mutex.rs.html#682-684">source</a><a href="#method.from" class="anchor"></a><h4 class="code-header">fn <a class="fnname">from</a>(s: T) -> Self</h4></section></summary><div class='docblock'>Converts to this type from the input type.</div></details></div></details><section id="impl-Send-for-Mutex%3CT%3E" class="impl has-srclink"><a class="srclink rightside" href="../../src/tokio/sync/mutex.rs.html#188">source</a><a href="#impl-Send-for-Mutex%3CT%3E" class="anchor"></a><h3 class="code-header">impl<T> Send for <a class="struct" href="struct.Mutex.html" title="struct tokio::sync::Mutex">Mutex</a><T><span class="where fmt-newline">where<br> T: ?Sized + Send,</span></h3></section><section id="impl-Sync-for-Mutex%3CT%3E" class="impl has-srclink"><a class="srclink rightside" href="../../src/tokio/sync/mutex.rs.html#189">source</a><a href="#impl-Sync-for-Mutex%3CT%3E" class="anchor"></a><h3 class="code-header">impl<T> Sync for <a class="struct" href="struct.Mutex.html" title="struct tokio::sync::Mutex">Mutex</a><T><span class="where fmt-newline">where<br> T: ?Sized + Send,</span></h3></section></div><h2 id="synthetic-implementations" class="small-section-header">Auto Trait Implementations<a href="#synthetic-implementations" class="anchor"></a></h2><div id="synthetic-implementations-list"><section id="impl-RefUnwindSafe-for-Mutex%3CT%3E" class="impl has-srclink"><a href="#impl-RefUnwindSafe-for-Mutex%3CT%3E" class="anchor"></a><h3 class="code-header">impl<T> !RefUnwindSafe for <a class="struct" href="struct.Mutex.html" title="struct tokio::sync::Mutex">Mutex</a><T></h3></section><section id="impl-Unpin-for-Mutex%3CT%3E" class="impl has-srclink"><a href="#impl-Unpin-for-Mutex%3CT%3E" class="anchor"></a><h3 class="code-header">impl<T: ?Sized> Unpin for <a class="struct" href="struct.Mutex.html" title="struct tokio::sync::Mutex">Mutex</a><T><span class="where fmt-newline">where<br> T: Unpin,</span></h3></section><section id="impl-UnwindSafe-for-Mutex%3CT%3E" class="impl has-srclink"><a href="#impl-UnwindSafe-for-Mutex%3CT%3E" class="anchor"></a><h3 class="code-header">impl<T: ?Sized> UnwindSafe for <a class="struct" href="struct.Mutex.html" title="struct tokio::sync::Mutex">Mutex</a><T><span class="where fmt-newline">where<br> T: UnwindSafe,</span></h3></section></div><h2 id="blanket-implementations" class="small-section-header">Blanket Implementations<a href="#blanket-implementations" class="anchor"></a></h2><div id="blanket-implementations-list"><details class="rustdoc-toggle implementors-toggle"><summary><section id="impl-Any-for-Mutex%3CT%3E" class="impl has-srclink"><a href="#impl-Any-for-Mutex%3CT%3E" class="anchor"></a><h3 class="code-header">impl<T> Any for T<span class="where fmt-newline">where<br> T: 'static + ?Sized,</span></h3></section></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><section id="method.type_id" class="method trait-impl has-srclink"><a href="#method.type_id" class="anchor"></a><h4 class="code-header">fn <a class="fnname">type_id</a>(&self) -> TypeId</h4></section></summary><div class='docblock'>Gets the <code>TypeId</code> of <code>self</code>. <a>Read more</a></div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><section id="impl-Borrow%3CT%3E-for-Mutex%3CT%3E" class="impl has-srclink"><a href="#impl-Borrow%3CT%3E-for-Mutex%3CT%3E" class="anchor"></a><h3 class="code-header">impl<T> Borrow<T> for T<span class="where fmt-newline">where<br> T: ?Sized,</span></h3></section></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><section id="method.borrow" class="method trait-impl has-srclink"><span class="since rightside" title="const unstable">const: <a href="https://github.com/rust-lang/rust/issues/91522" title="Tracking issue for const_borrow">unstable</a></span><a href="#method.borrow" class="anchor"></a><h4 class="code-header">fn <a class="fnname">borrow</a>(&self) -> &T</h4></section></summary><div class='docblock'>Immutably borrows from an owned value. <a>Read more</a></div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><section id="impl-BorrowMut%3CT%3E-for-Mutex%3CT%3E" class="impl has-srclink"><a href="#impl-BorrowMut%3CT%3E-for-Mutex%3CT%3E" class="anchor"></a><h3 class="code-header">impl<T> BorrowMut<T> for T<span class="where fmt-newline">where<br> T: ?Sized,</span></h3></section></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><section id="method.borrow_mut" class="method trait-impl has-srclink"><span class="since rightside" title="const unstable">const: <a href="https://github.com/rust-lang/rust/issues/91522" title="Tracking issue for const_borrow">unstable</a></span><a href="#method.borrow_mut" class="anchor"></a><h4 class="code-header">fn <a class="fnname">borrow_mut</a>(&mut self) -> &mut T</h4></section></summary><div class='docblock'>Mutably borrows from an owned value. <a>Read more</a></div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><section id="impl-From%3C!%3E-for-Mutex%3CT%3E" class="impl has-srclink"><a href="#impl-From%3C!%3E-for-Mutex%3CT%3E" class="anchor"></a><h3 class="code-header">impl<T> From<!> for T</h3></section></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><section id="method.from-2" class="method trait-impl has-srclink"><span class="since rightside" title="const unstable">const: <a href="https://github.com/rust-lang/rust/issues/88674" title="Tracking issue for const_convert">unstable</a></span><a href="#method.from-2" class="anchor"></a><h4 class="code-header">fn <a class="fnname">from</a>(t: !) -> T</h4></section></summary><div class='docblock'>Converts to this type from the input type.</div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><section id="impl-From%3CT%3E-for-Mutex%3CT%3E-1" class="impl has-srclink"><a href="#impl-From%3CT%3E-for-Mutex%3CT%3E-1" class="anchor"></a><h3 class="code-header">impl<T> From<T> for T</h3></section></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><section id="method.from-1" class="method trait-impl has-srclink"><span class="since rightside" title="const unstable">const: <a href="https://github.com/rust-lang/rust/issues/88674" title="Tracking issue for const_convert">unstable</a></span><a href="#method.from-1" class="anchor"></a><h4 class="code-header">fn <a class="fnname">from</a>(t: T) -> T</h4></section></summary><div class="docblock"><p>Returns the argument unchanged.</p> |
| </div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><section id="impl-Into%3CU%3E-for-Mutex%3CT%3E" class="impl has-srclink"><a href="#impl-Into%3CU%3E-for-Mutex%3CT%3E" class="anchor"></a><h3 class="code-header">impl<T, U> Into<U> for T<span class="where fmt-newline">where<br> U: From<T>,</span></h3></section></summary><div class="impl-items"><details class="rustdoc-toggle method-toggle" open><summary><section id="method.into" class="method trait-impl has-srclink"><span class="since rightside" title="const unstable">const: <a href="https://github.com/rust-lang/rust/issues/88674" title="Tracking issue for const_convert">unstable</a></span><a href="#method.into" class="anchor"></a><h4 class="code-header">fn <a class="fnname">into</a>(self) -> 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>[From]<T> for U</code> chooses to do.</p> |
| </div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><section id="impl-TryFrom%3CU%3E-for-Mutex%3CT%3E" class="impl has-srclink"><a href="#impl-TryFrom%3CU%3E-for-Mutex%3CT%3E" class="anchor"></a><h3 class="code-header">impl<T, U> TryFrom<U> for T<span class="where fmt-newline">where<br> U: Into<T>,</span></h3></section></summary><div class="impl-items"><details class="rustdoc-toggle" open><summary><section id="associatedtype.Error-1" class="associatedtype trait-impl has-srclink"><a href="#associatedtype.Error-1" class="anchor"></a><h4 class="code-header">type <a class="associatedtype">Error</a> = Infallible</h4></section></summary><div class='docblock'>The type returned in the event of a conversion error.</div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="method.try_from" class="method trait-impl has-srclink"><span class="since rightside" title="const unstable">const: <a href="https://github.com/rust-lang/rust/issues/88674" title="Tracking issue for const_convert">unstable</a></span><a href="#method.try_from" class="anchor"></a><h4 class="code-header">fn <a class="fnname">try_from</a>(value: U) -> Result<T, <T as TryFrom<U>>::Error></h4></section></summary><div class='docblock'>Performs the conversion.</div></details></div></details><details class="rustdoc-toggle implementors-toggle"><summary><section id="impl-TryInto%3CU%3E-for-Mutex%3CT%3E" class="impl has-srclink"><a href="#impl-TryInto%3CU%3E-for-Mutex%3CT%3E" class="anchor"></a><h3 class="code-header">impl<T, U> TryInto<U> for T<span class="where fmt-newline">where<br> U: TryFrom<T>,</span></h3></section></summary><div class="impl-items"><details class="rustdoc-toggle" open><summary><section id="associatedtype.Error" class="associatedtype trait-impl has-srclink"><a href="#associatedtype.Error" class="anchor"></a><h4 class="code-header">type <a class="associatedtype">Error</a> = <U as TryFrom<T>>::Error</h4></section></summary><div class='docblock'>The type returned in the event of a conversion error.</div></details><details class="rustdoc-toggle method-toggle" open><summary><section id="method.try_into" class="method trait-impl has-srclink"><span class="since rightside" title="const unstable">const: <a href="https://github.com/rust-lang/rust/issues/88674" title="Tracking issue for const_convert">unstable</a></span><a href="#method.try_into" class="anchor"></a><h4 class="code-header">fn <a class="fnname">try_into</a>(self) -> Result<U, <U as TryFrom<T>>::Error></h4></section></summary><div class='docblock'>Performs the conversion.</div></details></div></details></div></section></div></main><div id="rustdoc-vars" data-root-path="../../" data-current-crate="tokio" data-themes="ayu,dark,light" data-resource-suffix="" data-rustdoc-version="1.66.0-nightly (5c8bff74b 2022-10-21)" ></div></body></html> |