<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Issue 2363: Defect in 30.4.1.4.1 [thread.sharedtimedmutex.class]</title>
<meta property="og:title" content="Issue 2363: Defect in 30.4.1.4.1 [thread.sharedtimedmutex.class]">
<meta property="og:description" content="C++ library issue. Status: Resolved">
<meta property="og:url" content="https://cplusplus.github.io/LWG/issue2363.html">
<meta property="og:type" content="website">
<meta property="og:image" content="http://cplusplus.github.io/LWG/images/cpp_logo.png">
<meta property="og:image:alt" content="C++ logo">
<style>
  p {text-align:justify}
  li {text-align:justify}
  pre code.backtick::before { content: "`" }
  pre code.backtick::after { content: "`" }
  blockquote.note
  {
    background-color:#E0E0E0;
    padding-left: 15px;
    padding-right: 15px;
    padding-top: 1px;
    padding-bottom: 1px;
  }
  ins {background-color:#A0FFA0}
  del {background-color:#FFA0A0}
  table.issues-index { border: 1px solid; border-collapse: collapse; }
  table.issues-index th { text-align: center; padding: 4px; border: 1px solid; }
  table.issues-index td { padding: 4px; border: 1px solid; }
  table.issues-index td:nth-child(1) { text-align: right; }
  table.issues-index td:nth-child(2) { text-align: left; }
  table.issues-index td:nth-child(3) { text-align: left; }
  table.issues-index td:nth-child(4) { text-align: left; }
  table.issues-index td:nth-child(5) { text-align: center; }
  table.issues-index td:nth-child(6) { text-align: center; }
  table.issues-index td:nth-child(7) { text-align: left; }
  table.issues-index td:nth-child(5) span.no-pr { color: red; }
  @media (prefers-color-scheme: dark) {
     html {
        color: #ddd;
        background-color: black;
     }
     ins {
        background-color: #225522
     }
     del {
        background-color: #662222
     }
     a {
        color: #6af
     }
     a:visited {
        color: #6af
     }
     blockquote.note
     {
        background-color: rgba(255, 255, 255, .10)
     }
  }
</style>
</head>
<body>
<hr>
<p><em>This page is a snapshot from the LWG issues list, see the <a href="lwg-active.html">Library Active Issues List</a> for more information and the meaning of <a href="lwg-active.html#Resolved">Resolved</a> status.</em></p>
<h3 id="2363"><a href="lwg-defects.html#2363">2363</a>. Defect in 30.4.1.4.1 [thread.sharedtimedmutex.class]</h3>
<p><b>Section:</b> 32.6.4.5.2 <a href="https://wg21.link/thread.sharedtimedmutex.class">[thread.sharedtimedmutex.class]</a> <b>Status:</b> <a href="lwg-active.html#Resolved">Resolved</a>
 <b>Submitter:</b> Richard Smith <b>Opened:</b> 2014-02-16 <b>Last modified:</b> 2021-05-18</p>
<p><b>Priority: </b>2
</p>
<p><b>View all issues with</b> <a href="lwg-status.html#Resolved">Resolved</a> status.</p>
<p><b>Discussion:</b></p>
<p>
32.6.4.5.2 <a href="https://wg21.link/thread.sharedtimedmutex.class">[thread.sharedtimedmutex.class]</a> paragraph 2:
</p>
<blockquote><p> The class <code>shared_timed_mutex</code> shall satisfy all of the
<code>SharedTimedMutex</code> requirements (30.4.1.4). It shall be a standard layout class (Clause 9).
</p></blockquote>
<p>
There's no <code>SharedTimedMutex</code> requirements; this name doesn't appear anywhere else in the standard. (Prior to N3891,
this was <code>SharedMutex</code>, which was equally undefined.)
<p/>
I assume this concept should be defined somewhere?
<p/>
Also, n3891 changes 32.6.4.5 <a href="https://wg21.link/thread.sharedtimedmutex.requirements">[thread.sharedtimedmutex.requirements]</a> from defining "shared mutex type" to defining
"shared timed mutex type", but its paragraph 2 still talks about "shared mutex type". Is that OK? I think you could argue
that it's clear enough what it means, but presumably it should use the term that paragraph 1 defined.
<p/>
32.6.5.5 <a href="https://wg21.link/thread.lock.shared">[thread.lock.shared]</a> paragraph 1 talks about the "shared mutex requirements", which again is a term that isn't
defined, and presumably means "the requirements on a shared timed mutex type" or similar (maybe if <code>SharedMutex</code> or
<code>SharedTimedMutex</code> were defined it could be reused here).
</p>

<p><i>[2014-05-22, Daniel comments]</i></p>

<p>
As for <code>SharedTimedMutex</code>, there exists a similar problem in regard to <code>TimedMutex</code> referred to in
32.6.4.3.2 <a href="https://wg21.link/thread.timedmutex.class">[thread.timedmutex.class]</a> p2 and in 32.6.4.3.3 <a href="https://wg21.link/thread.timedmutex.recursive">[thread.timedmutex.recursive]</a> p2, but nowhere defined.
<p/>
Another problem is, that according to 32.6.4.2.2 <a href="https://wg21.link/thread.mutex.class">[thread.mutex.class]</a> p3, "The class <code>mutex</code> shall satisfy all the
<code>Mutex</code> requirements (32.6.4 <a href="https://wg21.link/thread.mutex.requirements">[thread.mutex.requirements]</a>).", but there are no concrete <code>Mutex</code> requirements,
32.6.4 <a href="https://wg21.link/thread.mutex.requirements">[thread.mutex.requirements]</a> &mdash; titled as "Mutex requirements" &mdash; describes <em>mutex types</em>,
<em>timed mutex types</em>, and <em>shared timed mutex types</em>.
</p>

<p><i>[2014-06-08, Daniel comments and provides wording]</i></p>

<p>
The presented wording adds to the existing <em>mutex types</em>, <em>timed mutex types</em>, and <em>shared timed mutex types</em>
terms a new set of corresponding <code>MutexType</code>, <code>TimedMutexType</code>, and <code>SharedTimedMutexType</code> requirements.
<p/>
The reason for the change of requirement names is two-fold: First, the new name better matches the intention to have a concrete
name for the requirements imposed on the corresponding <em>mutex types</em> (This kind of requirement deviate from the more general
<code>Lockable</code> requirements, which are not restricted to a explicitly enumerated set of library types). Second, using
<code>**MutexType</code> over <code>**Mutex</code> provides the additional advantage that it reduces the chances of confusing named
requirements from template parameters named <code>Mutex</code> (such as for <code>unique_lock</code> or <code>shared_lock</code>).
<p/>
Nonetheless the here presented wording has one unfortunate side-effect: Once applied it would have the effect that types
used to instantiate <code>std::shared_lock</code> cannot be user-defined shared mutex types due to 32.6.5.5 <a href="https://wg21.link/thread.lock.shared">[thread.lock.shared]</a>.
The reason is based on the currently lack of an existing <code>SharedLockable</code> requirement set, which would complete the
existing <code>BasicLockable</code> and <code>Lockable</code> requirements (which are "real" requirements). This restriction is not
actually a problem introduced by the provided resolution but instead one that existed before but becomes more obvious now.
</p>

<p><i>[2015-02 Cologne]</i></p>

<p>
Handed over to SG1.
</p>

<p><i>[2015-05 Lenexa, SG1 response]</i></p>

<p>
Thanks to Daniel, and please put it in SG1-OK status. Perhaps open another issue for the remaining problem Daniel points out?
</p>

<p><i>[2015-10 pre-Kona]</i></p>

<p>
SG1 hands this over to LWG for wording review
</p>

<p><i>[2015-10-21 Kona, Daniel comments and adjusts wording to to untimed shared mutex types]</i></p>

<p>
The new wording reflects the addition of the new shared mutex types. The approach used for <code>shared_lock</code>
is similar to the one used for <code>unique_lock</code>: The template argument <code>Mutex</code> has a reduced requirement set that is not
sufficient for <em>all</em> operations. Only those members that require stronger requirements of <code>SharedTimedMutexType</code>
specify that additionally in the <i>Requires</i> element of the corresponding prototype specifications.
<p/>
The proposed wording could be more general if we would introduce more fundamental requirements set for <code>SharedLockable</code>
and <code>SharedTimedLockable</code> types which could be satisfied by user-provided types as well, because the
<code>SharedMutexType</code> and <code>SharedTimedMutexType</code> requirements are essentially restricted to an enumerated set of
types provided by the Standard Library. But this extension seemed too large for this issue and can be easily fixed later
without any harm.
</p>

<p><b>Previous resolution [SUPERSEDED]:</b></p>
<blockquote class="note">
<p>This wording is relative to N3936.</p>

<ol>
<li><p>Change 32.6.4.2 <a href="https://wg21.link/thread.mutex.requirements.mutex">[thread.mutex.requirements.mutex]</a> as indicated:</p>

<blockquote><p>
-1- The <em>mutex types</em> are the standard library types <code>std::mutex</code>, <code>std::recursive_mutex</code>, <code>std::timed_mutex</code>,
<code>std::recursive_timed_mutex</code>, and <code>std::shared_timed_mutex</code>. They shall meet the <ins><code><em>MutexType</em></code></ins>
requirements set out in this section. In this description, <code>m</code> denotes an object of a mutex type.
</p></blockquote>
</li>

<li><p>Change 32.6.4.2.2 <a href="https://wg21.link/thread.mutex.class">[thread.mutex.class]</a> as indicated:</p>

<blockquote><p>
-3- The class <code>mutex</code> shall satisfy all the <code>Mutex<ins>Type</ins></code> requirements
(<ins>32.6.4.2 <a href="https://wg21.link/thread.mutex.requirements.mutex">[thread.mutex.requirements.mutex]</a></ins><del>32.6.4 <a href="https://wg21.link/thread.mutex.requirements">[thread.mutex.requirements]</a></del>).
It shall be a standard-layout class (Clause 9).
</p></blockquote>
</li>

<li><p>Change 32.6.4.2.3 <a href="https://wg21.link/thread.mutex.recursive">[thread.mutex.recursive]</a> as indicated:</p>

<blockquote><p>
-2- The class <code>recursive_mutex</code> shall satisfy all the <del>Mutex</del><ins><code>MutexType</code></ins> requirements
(<ins>32.6.4.2 <a href="https://wg21.link/thread.mutex.requirements.mutex">[thread.mutex.requirements.mutex]</a></ins><del>32.6.4 <a href="https://wg21.link/thread.mutex.requirements">[thread.mutex.requirements]</a></del>).
It shall be a standard-layout class (Clause 9).
</p></blockquote>
</li>

<li><p>Change 32.6.4.3 <a href="https://wg21.link/thread.timedmutex.requirements">[thread.timedmutex.requirements]</a> as indicated:</p>

<blockquote><p>
-1- The <em>timed mutex types</em> are the standard library types <code>std::timed_mutex</code>, <code>std::recursive_timed_mutex</code>,
and <code>std::shared_timed_mutex</code>. They shall meet the <ins><code><em>TimedMutexType</em></code></ins> requirements set out below.
In this description, <code>m</code> denotes an object of a mutex type, <code>rel_time</code> denotes an object of an instantiation of
<code>duration</code> (20.12.5), and <code>abs_time</code> denotes an object of an instantiation of <code>time_point</code> (20.12.6).
</p></blockquote>
</li>

<li><p>Change 32.6.4.3.2 <a href="https://wg21.link/thread.timedmutex.class">[thread.timedmutex.class]</a> as indicated:</p>

<blockquote><p>
-2- The class <code>timed_mutex</code> shall satisfy all of the <code>TimedMutex<ins>Type</ins></code> requirements
(32.6.4.3 <a href="https://wg21.link/thread.timedmutex.requirements">[thread.timedmutex.requirements]</a>). It shall be a standard-layout class (Clause 9).
</p></blockquote>
</li>

<li><p>Change 32.6.4.3.3 <a href="https://wg21.link/thread.timedmutex.recursive">[thread.timedmutex.recursive]</a> as indicated:</p>

<blockquote><p>
-2- The class <code>recursive_timed_mutex</code> shall satisfy all of the <code>TimedMutex<ins>Type</ins></code> requirements
(32.6.4.3 <a href="https://wg21.link/thread.timedmutex.requirements">[thread.timedmutex.requirements]</a>). It shall be a standard-layout class (Clause 9).
</p></blockquote>
</li>

<li><p>Change 32.6.4.5 <a href="https://wg21.link/thread.sharedtimedmutex.requirements">[thread.sharedtimedmutex.requirements]</a> as indicated: [<i>Drafting note</i>: The reference to the
timed mutex types requirements has been moved <em>after</em> introducing the new requirement set to ensure that
<code>SharedTimedMutexType</code> <em>refine</em> <code>TimedMutexType</code>.]</p>

<blockquote>
<p>
-1- The standard library type <code>std::shared_timed_mutex</code> is a <em>shared timed mutex type</em>. Shared timed mutex
types shall meet the <ins><code><em>SharedTimedMutexType</em></code></ins> requirements <del>of timed mutex types
(32.6.4.3 <a href="https://wg21.link/thread.timedmutex.requirements">[thread.timedmutex.requirements]</a>), and additionally shall meet the requirements</del> set out below. In this
description, <code>m</code> denotes an object of a mutex type, <code>rel_type</code> denotes
an object of an instantiation of <code>duration</code> (20.12.5), and <code>abs_time</code> denotes an object of an instantiation of
<code>time_point</code> (20.12.6).
<p/>
<ins>-?- The shared timed mutex types shall meet the <code>TimedMutexType</code> requirements (32.6.4.3 <a href="https://wg21.link/thread.timedmutex.requirements">[thread.timedmutex.requirements]</a>).</ins>
</p>
</blockquote>
</li>

<li><p>Change 32.6.4.5.2 <a href="https://wg21.link/thread.sharedtimedmutex.class">[thread.sharedtimedmutex.class]</a> as indicated:</p>

<blockquote><p>
-2- The class <code>shared_timed_mutex</code> shall satisfy all of the <code>SharedTimedMutex<ins>Type</ins></code> requirements
(32.6.4.5 <a href="https://wg21.link/thread.sharedtimedmutex.requirements">[thread.sharedtimedmutex.requirements]</a>). It shall be a standard-layout class (Clause 9).
</p></blockquote>
</li>

<li><p>Change 32.6.5.5 <a href="https://wg21.link/thread.lock.shared">[thread.lock.shared]</a> as indicated: [<i>Drafting note</i>: Once
<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3995.htm">N3995</a> has been applied, the following
reference should be changed to the new <code>SharedMutexType</code> requirements ([thread.sharedmutex.requirements]) or
even better to some new <code>SharedLockable</code> requirements (to be defined) &mdash; <i>end drafting note</i>]</p>

<blockquote><p>
-1- [&hellip;] The supplied <code>Mutex</code> type shall meet the <del>shared mutex</del><ins><code>SharedTimedMutexType</code></ins> requirements
(32.6.4.5 <a href="https://wg21.link/thread.sharedtimedmutex.requirements">[thread.sharedtimedmutex.requirements]</a>).
<p/>
-2- [<i>Note</i>: <code>shared_lock&lt;Mutex&gt;</code> meets the <code>TimedLockable</code> requirements
(30.2.5.4). &mdash; <i>end note</i>]
</p></blockquote>
</li>
</ol>

</blockquote>

<p><i>[2016-02 Jacksonville]</i></p>

<p>
Marshall to review wording.
</p>

<p><i>[2018-08-23 Batavia Issues processing]</i></p>

<p>Tim to redraft.</p>
<p><i>[2021-05-18 Resolved by the adoption of <a href="https://wg21.link/P2160R1">P2160R1</a> at the February 2021 plenary. Status changed: Open &rarr; Resolved.]</i></p>



<p id="res-2363"><b>Proposed resolution:</b></p>
<p>This wording is relative to N4527.</p>

<ol>
<li><p>Change 32.6.4.2 <a href="https://wg21.link/thread.mutex.requirements.mutex">[thread.mutex.requirements.mutex]</a> as indicated:</p>

<blockquote><p>
-1- The <em>mutex types</em> are the standard library types <code>std::mutex</code>, <code>std::recursive_mutex</code>, <code>std::timed_mutex</code>,
<code>std::recursive_timed_mutex</code>, <code>std::shared_mutex</code>, and <code>std::shared_timed_mutex</code>. They shall meet the
<ins><code><em>MutexType</em></code></ins> requirements set out in this section. In this description, <code>m</code> denotes an object
of a mutex type.
<p/>
-2- The mutex types shall meet the <code>Lockable</code> requirements (32.2.5.3 <a href="https://wg21.link/thread.req.lockable.req">[thread.req.lockable.req]</a>).
</p></blockquote>
</li>

<li><p>Change 32.6.4.2.2 <a href="https://wg21.link/thread.mutex.class">[thread.mutex.class]</a> as indicated:</p>

<blockquote><p>
-3- The class <code>mutex</code> shall satisfy all the <code>Mutex<ins>Type</ins></code> requirements
(<ins>32.6.4.2 <a href="https://wg21.link/thread.mutex.requirements.mutex">[thread.mutex.requirements.mutex]</a></ins><del>32.6.4 <a href="https://wg21.link/thread.mutex.requirements">[thread.mutex.requirements]</a></del>).
It shall be a standard-layout class (Clause 9).
</p></blockquote>
</li>

<li><p>Change 32.6.4.2.3 <a href="https://wg21.link/thread.mutex.recursive">[thread.mutex.recursive]</a> as indicated:</p>

<blockquote><p>
-2- The class <code>recursive_mutex</code> shall satisfy all the <del>Mutex</del><ins><code>MutexType</code></ins> requirements
(<ins>32.6.4.2 <a href="https://wg21.link/thread.mutex.requirements.mutex">[thread.mutex.requirements.mutex]</a></ins><del>32.6.4 <a href="https://wg21.link/thread.mutex.requirements">[thread.mutex.requirements]</a></del>).
It shall be a standard-layout class (Clause 9).
</p></blockquote>
</li>

<li><p>Change 32.6.4.3 <a href="https://wg21.link/thread.timedmutex.requirements">[thread.timedmutex.requirements]</a> as indicated:</p>

<blockquote><p>
-1- The <em>timed mutex types</em> are the standard library types <code>std::timed_mutex</code>, <code>std::recursive_timed_mutex</code>,
and <code>std::shared_timed_mutex</code>. They shall meet the <ins><code><em>TimedMutexType</em></code></ins> requirements set out below.
In this description, <code>m</code> denotes an object of a mutex type, <code>rel_time</code> denotes an object of an instantiation of
<code>duration</code> (20.12.5), and <code>abs_time</code> denotes an object of an instantiation of <code>time_point</code> (20.12.6).
<p/>
-2- The timed mutex types shall meet the <code>TimedLockable</code> requirements (32.2.5.4 <a href="https://wg21.link/thread.req.lockable.timed">[thread.req.lockable.timed]</a>).
</p></blockquote>
</li>

<li><p>Change 32.6.4.3.2 <a href="https://wg21.link/thread.timedmutex.class">[thread.timedmutex.class]</a> as indicated:</p>

<blockquote><p>
-2- The class <code>timed_mutex</code> shall satisfy all of the <code>TimedMutex<ins>Type</ins></code> requirements
(32.6.4.3 <a href="https://wg21.link/thread.timedmutex.requirements">[thread.timedmutex.requirements]</a>). It shall be a standard-layout class (Clause 9).
</p></blockquote>
</li>

<li><p>Change 32.6.4.3.3 <a href="https://wg21.link/thread.timedmutex.recursive">[thread.timedmutex.recursive]</a> as indicated:</p>

<blockquote><p>
-2- The class <code>recursive_timed_mutex</code> shall satisfy all of the <code>TimedMutex<ins>Type</ins></code> requirements
(32.6.4.3 <a href="https://wg21.link/thread.timedmutex.requirements">[thread.timedmutex.requirements]</a>). It shall be a standard-layout class (Clause 9).
</p></blockquote>
</li>

<li><p>Change 32.6.4.4 <a href="https://wg21.link/thread.sharedmutex.requirements">[thread.sharedmutex.requirements]</a> as indicated:  [<i>Drafting note</i>: The reference to the
mutex types requirements has been moved <em>after</em> introducing the new requirement set to ensure that
<code>SharedMutexType</code> <em>refines</em> <code>MutexType</code>.]</p>

<blockquote><p>
-1- The standard library types <code>std::shared_mutex</code> and <code>std::shared_timed_mutex</code> are <em>shared mutex types</em>.
Shared mutex types shall meet the <ins><code><em>SharedMutexType</em></code></ins> requirements <del>of mutex types
(32.6.4.2 <a href="https://wg21.link/thread.mutex.requirements.mutex">[thread.mutex.requirements.mutex]</a>), and additionally shall meet the
requirements</del> set out below. In this description, <code>m</code> denotes an object of a shared mutex type.
<p/>
<ins>-?- The shared mutex types shall meet the <code>MutexType</code> requirements (32.6.4.2 <a href="https://wg21.link/thread.mutex.requirements.mutex">[thread.mutex.requirements.mutex]</a>).</ins>
</p>
</blockquote>
</li>

<li><p>Change 32.6.4.4.2 <a href="https://wg21.link/thread.sharedmutex.class">[thread.sharedmutex.class]</a> as indicated:</p>

<blockquote><p>
-2- The class <code>shared_mutex</code> shall satisfy all of the <ins><code>SharedMutexType</code></ins> requirements
<del>for shared mutexes</del> (32.6.4.4 <a href="https://wg21.link/thread.sharedmutex.requirements">[thread.sharedmutex.requirements]</a>). It shall be a standard-layout class (Clause 9).
</p></blockquote>
</li>

<li><p>Change 32.6.4.5 <a href="https://wg21.link/thread.sharedtimedmutex.requirements">[thread.sharedtimedmutex.requirements]</a> as indicated: [<i>Drafting note</i>: The reference to the
timed mutex types requirements has been moved <em>after</em> introducing the new requirement set to ensure that
<code>SharedTimedMutexType</code> <em>refines</em> <code>TimedMutexType</code> and <code>SharedMutexType</code>.]</p>

<blockquote>
<p>
-1- The standard library type <code>std::shared_timed_mutex</code> is a <em>shared timed mutex type</em>. Shared timed mutex
types shall meet the <ins><code><em>SharedTimedMutexType</em></code></ins> requirements <del>of timed mutex types
(32.6.4.3 <a href="https://wg21.link/thread.timedmutex.requirements">[thread.timedmutex.requirements]</a>), shared mutex types (32.6.4.4 <a href="https://wg21.link/thread.sharedmutex.requirements">[thread.sharedmutex.requirements]</a>),
and additionally shall meet the requirements</del> set out below. In this description, <code>m</code> denotes an object of
a shared timed mutex type, <code>rel_type</code> denotes an object of an instantiation of <code>duration</code> (20.12.5), and
<code>abs_time</code> denotes an object of an instantiation of <code>time_point</code> (20.12.6).
<p/>
<ins>-?- The shared timed mutex types shall meet the <code>TimedMutexType</code> requirements (32.6.4.3 <a href="https://wg21.link/thread.timedmutex.requirements">[thread.timedmutex.requirements]</a>)
and the <code>SharedMutexType</code> requirements (32.6.4.4 <a href="https://wg21.link/thread.sharedmutex.requirements">[thread.sharedmutex.requirements]</a>).</ins>
</p>
</blockquote>
</li>

<li><p>Change 32.6.4.5.2 <a href="https://wg21.link/thread.sharedtimedmutex.class">[thread.sharedtimedmutex.class]</a> as indicated:</p>

<blockquote><p>
-2- The class <code>shared_timed_mutex</code> shall satisfy all of the <ins><code>SharedTimedMutexType</code></ins> requirements
<del>for shared timed mutexes</del> (32.6.4.5 <a href="https://wg21.link/thread.sharedtimedmutex.requirements">[thread.sharedtimedmutex.requirements]</a>). It shall be a standard-layout
class (Clause 9).
</p></blockquote>
</li>

<li><p>Change 32.6.5.5 <a href="https://wg21.link/thread.lock.shared">[thread.lock.shared]</a> as indicated:</p>

<blockquote><p>
-1- [&hellip;] The supplied <code>Mutex</code> type shall meet the <del>shared mutex</del><ins><code>SharedMutexType</code></ins> requirements
(<del>32.6.4.5 <a href="https://wg21.link/thread.sharedtimedmutex.requirements">[thread.sharedtimedmutex.requirements]</a></del><ins>32.6.4.4 <a href="https://wg21.link/thread.sharedmutex.requirements">[thread.sharedmutex.requirements]</a></ins>).
<p/>
-2- [<i>Note</i>: <code>shared_lock&lt;Mutex&gt;</code> meets the <code>TimedLockable</code> requirements
(30.2.5.4). &mdash; <i>end note</i>]
</p></blockquote>
</li>

<li><p>Change 32.6.5.5.2 <a href="https://wg21.link/thread.lock.shared.cons">[thread.lock.shared.cons]</a> as indicated:</p>

<blockquote>
<pre>
template &lt;class Clock, class Duration&gt;
  shared_lock(mutex_type&amp; m,
              const chrono::time_point&lt;Clock, Duration&gt;&amp; abs_time);
</pre>
<blockquote>
<p>
-14- <i>Requires</i>: <ins>The supplied <code>Mutex</code> type shall meet the <code>SharedTimedMutexType</code> requirements
(32.6.4.5 <a href="https://wg21.link/thread.sharedtimedmutex.requirements">[thread.sharedtimedmutex.requirements]</a>).</ins>
The calling thread does not own the mutex for any ownership mode.
<p/>
-15- <i>Effects</i>: Constructs an object of type <code>shared_lock</code> and calls <code>m.try_lock_shared_until(abs_time)</code>.
<p/>
[&hellip;]
</p>
</blockquote>
<pre>
template &lt;class Rep, class Period&gt;
  shared_lock(mutex_type&amp; m,
              const chrono::duration&lt;Rep, Period&gt;&amp; rel_time);
</pre>
<blockquote>
<p>
-17- <i>Requires</i>: <ins>The supplied <code>Mutex</code> type shall meet the <code>SharedTimedMutexType</code> requirements
(32.6.4.5 <a href="https://wg21.link/thread.sharedtimedmutex.requirements">[thread.sharedtimedmutex.requirements]</a>).</ins>
The calling thread does not own the mutex for any ownership mode.
<p/>
-18- <i>Effects</i>: Constructs an object of type <code>shared_lock</code> and calls <code>m.try_lock_shared_for(rel_time)</code>.
<p/>
[&hellip;]
</p>
</blockquote>
</blockquote>

</li>

<li><p>Change 32.6.5.5.3 <a href="https://wg21.link/thread.lock.shared.locking">[thread.lock.shared.locking]</a> as indicated:</p>

<blockquote>
<pre>
template &lt;class Clock, class Duration&gt;
  bool
  try_lock_until(const chrono::time_point&lt;Clock, Duration&gt;&amp; abs_time);
</pre>
<blockquote>
<p>
<ins>-?- <i>Requires</i>: The supplied <code>Mutex</code> type shall meet the <code>SharedTimedMutexType</code> requirements
(32.6.4.5 <a href="https://wg21.link/thread.sharedtimedmutex.requirements">[thread.sharedtimedmutex.requirements]</a>).</ins>
<p/>
-8- <i>Effects</i>: <code>pm-&gt;try_lock_shared_until(abs_time)</code>.
<p/>
[&hellip;]
</p>
</blockquote>
<pre>
template &lt;class Rep, class Period&gt;
  bool try_lock_for(const chrono::duration&lt;Rep, Period&gt;&amp; rel_time);
</pre>
<blockquote>
<p>
<ins>-?- <i>Requires</i>: The supplied <code>Mutex</code> type shall meet the <code>SharedTimedMutexType</code> requirements
(32.6.4.5 <a href="https://wg21.link/thread.sharedtimedmutex.requirements">[thread.sharedtimedmutex.requirements]</a>).</ins>
<p/>
-12- <i>Effects</i>: <code>pm-&gt;try_lock_shared_for(rel_time)</code>.
<p/>
[&hellip;]
</p>
</blockquote>
</blockquote>
</li>

</ol>






</body>
</html>
