<html>

<head>
<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
<meta name=Generator content="Microsoft Word 15 (filtered)">
<title>N3961 Shared Mutex</title>
<style>
<!--
 /* Font Definitions */
 @font-face
	{font-family:"Cambria Math";
	panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
	{font-family:Calibri;
	panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
	{font-family:"Segoe UI";
	panose-1:2 11 5 2 4 2 4 2 2 3;}
@font-face
	{font-family:Cambria;
	panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
	{font-family:Consolas;
	panose-1:2 11 6 9 2 2 4 3 2 4;}
@font-face
	{font-family:LMRoman10-Bold;
	panose-1:0 0 0 0 0 0 0 0 0 0;}
@font-face
	{font-family:LMMonoLt10-Bold;
	panose-1:0 0 0 0 0 0 0 0 0 0;}
@font-face
	{font-family:"Lucida Console";
	panose-1:2 11 6 9 4 5 4 2 2 4;}
@font-face
	{font-family:LMMono9-Regular;
	panose-1:0 0 0 0 0 0 0 0 0 0;}
@font-face
	{font-family:LMRoman7-Regular;
	panose-1:0 0 0 0 0 0 0 0 0 0;}
@font-face
	{font-family:LMRoman10-Regular;
	panose-1:0 0 0 0 0 0 0 0 0 0;}
@font-face
	{font-family:LMRoman10-Italic;
	panose-1:0 0 0 0 0 0 0 0 0 0;}
@font-face
	{font-family:LMMono10-Regular;
	panose-1:0 0 0 0 0 0 0 0 0 0;}
@font-face
	{font-family:LMRoman9-Italic;
	panose-1:0 0 0 0 0 0 0 0 0 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{margin:0in;
	margin-bottom:.0001pt;
	text-align:left;
	font-size:12.0pt;
	font-family:"Cambria","serif";}
h1
	{margin-top:24.0pt;
	margin-right:0in;
	margin-bottom:0in;
	margin-left:0in;
	margin-bottom:.0001pt;
	text-align:left;
	page-break-after:avoid;
	font-size:18.0pt;
	font-family:"Calibri","sans-serif";
	color:#345A8A;
	font-weight:bold;}
h2
	{margin-top:10.0pt;
	margin-right:0in;
	margin-bottom:0in;
	margin-left:0in;
	margin-bottom:.0001pt;
	text-align:left;
	page-break-after:avoid;
	font-size:16.0pt;
	font-family:"Calibri","sans-serif";
	color:#4F81BD;
	font-weight:bold;}
h3
	{margin-top:10.0pt;
	margin-right:0in;
	margin-bottom:0in;
	margin-left:0in;
	margin-bottom:.0001pt;
	text-align:left;
	page-break-after:avoid;
	font-size:14.0pt;
	font-family:"Calibri","sans-serif";
	color:#4F81BD;
	font-weight:bold;}
h4
	{margin-top:10.0pt;
	margin-right:0in;
	margin-bottom:0in;
	margin-left:0in;
	margin-bottom:.0001pt;
	text-align:left;
	page-break-after:avoid;
	font-size:12.0pt;
	font-family:"Calibri","sans-serif";
	color:#4F81BD;
	font-weight:bold;}
h5
	{margin-top:10.0pt;
	margin-right:0in;
	margin-bottom:0in;
	margin-left:0in;
	margin-bottom:.0001pt;
	text-align:left;
	page-break-after:avoid;
	font-size:12.0pt;
	font-family:"Calibri","sans-serif";
	color:#4F81BD;
	font-weight:normal;
	font-style:italic;}
p.MsoToc1, li.MsoToc1, div.MsoToc1
	{margin-top:0in;
	margin-right:0in;
	margin-bottom:5.0pt;
	margin-left:0in;
	text-align:left;
	font-size:12.0pt;
	font-family:"Cambria","serif";}
p.MsoTitle, li.MsoTitle, div.MsoTitle
	{margin-top:24.0pt;
	margin-right:0in;
	margin-bottom:12.0pt;
	margin-left:0in;
	text-align:center;
	page-break-after:avoid;
	font-size:18.0pt;
	font-family:"Calibri","sans-serif";
	color:#345A8A;
	font-weight:bold;}
p.MsoBodyText, li.MsoBodyText, div.MsoBodyText
	{margin-top:0in;
	margin-right:0in;
	margin-bottom:6.0pt;
	margin-left:0in;
	text-align:left;
	font-size:12.0pt;
	font-family:"Cambria","serif";}
p.MsoDate, li.MsoDate, div.MsoDate
	{margin:0in;
	margin-bottom:.0001pt;
	text-align:center;
	page-break-after:avoid;
	font-size:12.0pt;
	font-family:"Cambria","serif";}
a:link, span.MsoHyperlink
	{color:blue;
	text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
	{color:purple;
	text-decoration:underline;}
p
	{margin-right:0in;
	margin-left:0in;
	text-align:justify;
	font-size:12.0pt;
	font-family:"Times New Roman","serif";}
tt
	{font-family:"Courier New";}
p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
	{mso-style-link:"Balloon Text Char";
	margin:0in;
	margin-bottom:.0001pt;
	text-align:left;
	font-size:9.0pt;
	font-family:"Segoe UI","sans-serif";}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
	{margin-top:0in;
	margin-right:0in;
	margin-bottom:0in;
	margin-left:.5in;
	margin-bottom:.0001pt;
	text-align:left;
	font-size:12.0pt;
	font-family:"Cambria","serif";}
p.MsoListParagraphCxSpFirst, li.MsoListParagraphCxSpFirst, div.MsoListParagraphCxSpFirst
	{margin-top:0in;
	margin-right:0in;
	margin-bottom:0in;
	margin-left:.5in;
	margin-bottom:.0001pt;
	text-align:left;
	font-size:12.0pt;
	font-family:"Cambria","serif";}
p.MsoListParagraphCxSpMiddle, li.MsoListParagraphCxSpMiddle, div.MsoListParagraphCxSpMiddle
	{margin-top:0in;
	margin-right:0in;
	margin-bottom:0in;
	margin-left:.5in;
	margin-bottom:.0001pt;
	text-align:left;
	font-size:12.0pt;
	font-family:"Cambria","serif";}
p.MsoListParagraphCxSpLast, li.MsoListParagraphCxSpLast, div.MsoListParagraphCxSpLast
	{margin-top:0in;
	margin-right:0in;
	margin-bottom:0in;
	margin-left:.5in;
	margin-bottom:.0001pt;
	text-align:left;
	font-size:12.0pt;
	font-family:"Cambria","serif";}
p.MsoTocHeading, li.MsoTocHeading, div.MsoTocHeading
	{margin-top:12.0pt;
	margin-right:0in;
	margin-bottom:0in;
	margin-left:0in;
	margin-bottom:.0001pt;
	text-align:left;
	line-height:107%;
	page-break-after:avoid;
	font-size:16.0pt;
	font-family:"Calibri","sans-serif";
	color:#365F91;}
p.Compact, li.Compact, div.Compact
	{mso-style-name:Compact;
	margin-top:1.8pt;
	margin-right:0in;
	margin-bottom:1.8pt;
	margin-left:0in;
	text-align:left;
	font-size:12.0pt;
	font-family:"Cambria","serif";}
p.Authors, li.Authors, div.Authors
	{mso-style-name:Authors;
	margin:0in;
	margin-bottom:.0001pt;
	text-align:center;
	page-break-after:avoid;
	font-size:12.0pt;
	font-family:"Cambria","serif";}
p.BlockQuote, li.BlockQuote, div.BlockQuote
	{mso-style-name:"Block Quote";
	margin-top:5.0pt;
	margin-right:0in;
	margin-bottom:5.0pt;
	margin-left:0in;
	text-align:left;
	font-size:10.0pt;
	font-family:"Calibri","sans-serif";}
p.DefinitionTerm, li.DefinitionTerm, div.DefinitionTerm
	{mso-style-name:"Definition Term";
	margin:0in;
	margin-bottom:.0001pt;
	text-align:left;
	page-break-after:avoid;
	font-size:12.0pt;
	font-family:"Cambria","serif";
	font-weight:bold;}
p.Definition, li.Definition, div.Definition
	{mso-style-name:Definition;
	margin:0in;
	margin-bottom:.0001pt;
	text-align:left;
	font-size:12.0pt;
	font-family:"Cambria","serif";}
p.TableCaption, li.TableCaption, div.TableCaption
	{mso-style-name:"Table Caption";
	margin-top:0in;
	margin-right:0in;
	margin-bottom:6.0pt;
	margin-left:0in;
	text-align:left;
	font-size:12.0pt;
	font-family:"Cambria","serif";
	font-style:italic;}
p.ImageCaption, li.ImageCaption, div.ImageCaption
	{mso-style-name:"Image Caption";
	mso-style-link:"Body Text Char";
	margin-top:0in;
	margin-right:0in;
	margin-bottom:6.0pt;
	margin-left:0in;
	text-align:left;
	font-size:12.0pt;
	font-family:"Cambria","serif";
	font-style:italic;}
span.BodyTextChar
	{mso-style-name:"Body Text Char";
	mso-style-link:"Image Caption";}
span.VerbatimChar
	{mso-style-name:"Verbatim Char";
	mso-style-link:"Source Code";
	font-family:Consolas;}
span.FootnoteRef
	{mso-style-name:"Footnote Ref";
	vertical-align:super;}
span.Link
	{mso-style-name:Link;
	color:#4F81BD;}
p.SourceCode, li.SourceCode, div.SourceCode
	{mso-style-name:"Source Code";
	mso-style-link:"Verbatim Char";
	margin:0in;
	margin-bottom:.0001pt;
	text-align:left;
	word-break:break-all;
	font-size:12.0pt;
	font-family:"Cambria","serif";}
span.KeywordTok
	{mso-style-name:KeywordTok;
	font-family:Consolas;
	color:#007020;
	font-weight:bold;}
span.DataTypeTok
	{mso-style-name:DataTypeTok;
	font-family:Consolas;
	color:#902000;}
span.DecValTok
	{mso-style-name:DecValTok;
	font-family:Consolas;
	color:#40A070;}
span.BaseNTok
	{mso-style-name:BaseNTok;
	font-family:Consolas;
	color:#40A070;}
span.FloatTok
	{mso-style-name:FloatTok;
	font-family:Consolas;
	color:#40A070;}
span.CharTok
	{mso-style-name:CharTok;
	font-family:Consolas;
	color:#4070A0;}
span.StringTok
	{mso-style-name:StringTok;
	font-family:Consolas;
	color:#4070A0;}
span.CommentTok
	{mso-style-name:CommentTok;
	font-family:Consolas;
	color:#60A0B0;
	font-style:italic;}
span.OtherTok
	{mso-style-name:OtherTok;
	font-family:Consolas;
	color:#007020;}
span.AlertTok
	{mso-style-name:AlertTok;
	font-family:Consolas;
	color:red;
	font-weight:bold;}
span.FunctionTok
	{mso-style-name:FunctionTok;
	font-family:Consolas;
	color:#06287E;}
span.RegionMarkerTok
	{mso-style-name:RegionMarkerTok;
	font-family:Consolas;}
span.ErrorTok
	{mso-style-name:ErrorTok;
	font-family:Consolas;
	color:red;
	font-weight:bold;}
span.NormalTok
	{mso-style-name:NormalTok;
	font-family:Consolas;}
span.BalloonTextChar
	{mso-style-name:"Balloon Text Char";
	mso-style-link:"Balloon Text";
	font-family:"Segoe UI","sans-serif";}
.MsoChpDefault
	{font-size:12.0pt;
	font-family:"Cambria","serif";}
@page WordSection1
	{size:8.5in 11.0in;
	margin:1.0in .75in 1.0in .75in;}
div.WordSection1
	{page:WordSection1;}
 /* List Definitions */
 ol
	{margin-bottom:0in;}
ul
	{margin-bottom:0in;}
-->
</style>

</head>

<body lang=EN-US link=blue vlink=purple>

<div class=WordSection1>

<p class=MsoTitle>N3961: A proposal to add shared_mutex (untimed)</p>

<p class=Authors>Gor Nishanov (gorn@microsoft.com)</p>

<p class=MsoDate>2014-02-25</p>

<p class=MsoTocHeading><a name=introduction>Table of Contents</a></p>

<p class=MsoToc1><a href="#_Toc381263081">Background<span style='color:windowtext;
display:none;text-decoration:none'>.. </span><span
style='color:windowtext;display:none;text-decoration:none'>1</span></a></p>

<p class=MsoToc1><a href="#_Toc381263082">Proposed Wording<span
style='color:windowtext;display:none;text-decoration:none'>.. </span><span
style='color:windowtext;display:none;text-decoration:none'>1</span></a></p>

<p class=MsoToc1><a href="#_Toc381263083">Acknowledgements<span
style='color:windowtext;display:none;text-decoration:none'>. </span><span
style='color:windowtext;display:none;text-decoration:none'>3</span></a></p>

<p class=MsoNormal>&nbsp;</p>

<h1><a name="_Toc381263081">Background</a></h1>

<p class=MsoNormal>At the Issaquah ISO C++ meeting of 2014 shared_mutex was
renamed to shared_timed_mutex per proposal <a
href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3891.htm">N3891</a>
to follow the naming precedent set by timed_mutex and recursive_timed_mutex and
to leave room for an untimed shared_mutex which can be more efficient on some
platforms than shared_timed_mutex. </p>

<p class=MsoNormal>&nbsp;</p>

<p class=MsoNormal>This paper introduces shared_mutex without timed locking
requirement. This paper only includes the proposed wording. For background for
shared locking please refer to <a
href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3568.html">N3568</a><span
class=MsoHyperlink><span style='color:windowtext;text-decoration:none'>,</span></span><span
class=MsoHyperlink><span style='text-decoration:none'> </span></span><a
href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3659.html">N3659</a><span
class=MsoHyperlink><span style='text-decoration:none'> </span></span><span
class=MsoHyperlink><span style='color:windowtext;text-decoration:none'>and </span></span><a
href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3891.htm">N3891</a>.</p>

<h1><a name=proposed-wording></a><a name="_Toc381263082">Proposed Wording</a> </h1>

<p class=MsoNormal>Proposed wording is relative to the C++ draft that
incorporated SG1 motions available in branch motions-2014-02-sg1+2. </p>

<p class=MsoNormal>&nbsp;</p>

<p class=MsoNormal>Modify shared_mutex synopsis of [thread.mutex] as follows:</p>

<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='font-size:10.0pt;font-family:LMRoman10-Bold'>Header </span><span
style='font-size:10.0pt;font-family:LMMonoLt10-Bold'>&lt;shared_mutex&gt; </span><span
style='font-size:10.0pt;font-family:LMRoman10-Bold'>synopsis</span></p>

<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='font-size:10.0pt;font-family:LMRoman10-Bold'>&nbsp;</span></p>

<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='font-size:9.0pt;font-family:"Lucida Console"'>namespace std {</span></p>

<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='font-size:9.0pt;font-family:"Lucida Console"'> <span style='background:
lime'>class shared_mutex;</span></span></p>

<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='font-size:9.0pt;font-family:"Lucida Console"'> class shared_timed_mutex;</span></p>

<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='font-size:9.0pt;font-family:"Lucida Console"'> template &lt;class
Mutex&gt; class shared_lock;</span></p>

<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='font-size:9.0pt;font-family:"Lucida Console"'> template &lt;class
Mutex&gt;</span></p>

<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='font-size:9.0pt;font-family:"Lucida Console"'> void
swap(shared_lock&lt;Mutex&gt;&amp; x, shared_lock&lt;Mutex&gt;&amp; y)
noexcept;</span></p>

<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='font-size:9.0pt;font-family:"Lucida Console"'>}</span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:9.0pt;
font-family:"Lucida Console"'>&nbsp;</span></p>

<p class=MsoNormal>Modify [thread.mutex.requirements.mutex] as follows:</p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:9.0pt;
font-family:"Lucida Console"'>&nbsp;</span></p>

<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><b><span
style='font-size:10.0pt;font-family:LMRoman10-Bold'>Mutex types [thread.mutex.requirements.mutex]</span></b></p>

<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='font-size:7.0pt;font-family:LMRoman7-Regular'>1 </span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular'>The </span><i><span
style='font-size:10.0pt;font-family:LMRoman10-Italic'>mutex types </span></i><span
style='font-size:10.0pt;font-family:LMRoman10-Regular'>are the standard library
types </span><span style='font-size:10.0pt;font-family:LMMono10-Regular'>std::mutex</span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular'>, </span><span
style='font-size:10.0pt;font-family:LMMono10-Regular'>std::recursive_mutex</span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular'>, </span><span
style='font-size:10.0pt;font-family:LMMono10-Regular'>std::timed_mutex</span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular'>, </span><span
style='font-size:10.0pt;font-family:LMMono10-Regular'>std::recursive_timed_mutex</span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular'>, <span
style='background:lime'>std::shared_mutex,</span> and </span><span
style='font-size:10.0pt;font-family:LMMono10-Regular'>std::shared_timed_mutex</span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular'>. They shall meet the
requirements set out in this section. In this description, </span><span
style='font-size:10.0pt;font-family:LMMono10-Regular'>m </span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular'>denotes an object of a
mutex type.</span></p>

<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='font-size:10.0pt;font-family:LMRoman10-Regular'></span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;
font-family:LMRoman7-Regular'> 6 </span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular'>The expression </span><span
style='font-size:10.0pt;font-family:LMMono10-Regular'>m.lock() </span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular'>shall be well-formed and
have the following semantics:</span></p>

<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='font-size:7.0pt;font-family:LMRoman7-Regular'>7 </span><i><span
style='font-size:10.0pt;font-family:LMRoman10-Italic'>Requires: </span></i><span
style='font-size:10.0pt;font-family:LMRoman10-Regular'>If </span><span
style='font-size:10.0pt;font-family:LMMono10-Regular'>m </span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular'>is of type </span><span
style='font-size:10.0pt;font-family:LMMono10-Regular'>std::mutex, std::timed_mutex</span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular'>, <span
style='background:lime'>std::shared_mutex,</span> or std::shared_timed_mutex
the calling thread does not own the mutex.</span></p>

<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='font-size:7.0pt;font-family:LMRoman7-Regular'></span></p>

<p class=MsoNormal style='text-indent:.5in;text-autospace:none'><span
style='font-size:7.0pt;font-family:LMRoman7-Regular'>14 </span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular'>The expression </span><span
style='font-size:10.0pt;font-family:LMMono10-Regular'>m.try_lock() </span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular'>shall be well-formed and
have the following semantics:</span></p>

<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='font-size:7.0pt;font-family:LMRoman7-Regular'>15 </span><i><span
style='font-size:10.0pt;font-family:LMRoman10-Italic'>Requires: </span></i><span
style='font-size:10.0pt;font-family:LMRoman10-Regular'>If </span><span
style='font-size:10.0pt;font-family:LMMono10-Regular'>m </span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular'>is of type </span><span
style='font-size:10.0pt;font-family:LMMono10-Regular'>std::mutex,
std::timed_mutex</span><span style='font-size:10.0pt;font-family:LMRoman10-Regular'>,
<span style='background:lime'>std::shared_mutex,</span> or
std::shared_timed_mutex, the calling thread does not own the mutex.</span></p>

<p class=MsoNormal>&nbsp;</p>

<p class=MsoNormal>Insert a new section 30.4.1.4
[thread.sharedmutex.requirements]<br>
<br>
</p>

<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><b><span
style='font-size:10.0pt;font-family:LMRoman10-Bold;color:black'>30.4.1.4 Shared
mutex types [thread.sharedmutex.requirements]<br>
<br>
</span></b></p>

<p class=MsoNormal style='margin-left:.5in'><span style='font-size:7.0pt;
font-family:LMRoman7-Regular;color:black'>1 </span><span style='font-size:10.0pt;
font-family:LMRoman10-Regular;color:black'>The standard library types
std::shared_mutex and </span><span style='font-size:10.0pt;font-family:LMMono10-Regular;
color:black'>std::shared_timed_mutex </span><span style='font-size:10.0pt;
font-family:LMRoman10-Regular;color:black'>are </span><i><span
style='font-size:10.0pt;font-family:LMRoman10-Italic;color:black'>shared mutex
types</span></i><span style='font-size:10.0pt;font-family:LMRoman10-Regular;
color:black'>. Shared mutex types shall meet the requirements of mutex types (</span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular;color:blue'>30.4.1.2</span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular;color:black'>), and
additionally shall meet the requirements set out below. In this description, </span><span
style='font-size:10.0pt;font-family:LMMono10-Regular;color:black'>m </span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular;color:black'>denotes an
object of a mutex type.</span></p>

<p class=MsoNormal>&nbsp;</p>

<div style='border:solid windowtext 1.0pt;padding:1.0pt 4.0pt 1.0pt 4.0pt'>

<p class=MsoNormal style='border:none;padding:0in'>Note to Editor: please move
clauses 2-23 from [thread.sharedtimedmutex.requirements] to this point.</p>

</div>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;
font-family:LMRoman7-Regular;color:black'>&nbsp;</span></p>

<div style='border:solid windowtext 1.0pt;padding:1.0pt 4.0pt 1.0pt 4.0pt'>

<p class=MsoNormal style='text-autospace:none;border:none;padding:0in'><span
style='font-size:7.0pt;font-family:LMRoman7-Regular;color:black'>Excerpt from
clauses 2  23 presented here for convenience of the reviewer.</span></p>

<p class=MsoNormal style='text-autospace:none;border:none;padding:0in'><span
style='font-size:7.0pt;font-family:LMRoman7-Regular;color:black'><br>
2 </span><span style='font-size:10.0pt;font-family:LMRoman10-Regular;
color:black'>In addition to the exclusive lock ownership mode specified in </span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular;color:blue'>30.4.1.2</span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular;color:black'>, shared
mutex types provide a </span><i><span style='font-size:10.0pt;font-family:LMRoman10-Italic;
color:black'>shared</span></i></p>

<p class=MsoNormal style='text-autospace:none;border:none;padding:0in'><i><span
style='font-size:10.0pt;font-family:LMRoman10-Italic;color:black'>lock </span></i><span
style='font-size:10.0pt;font-family:LMRoman10-Regular;color:black'>ownership
mode. Multiple execution agents can simultaneously hold a shared lock ownership
of a shared</span></p>

<p class=MsoNormal style='border:none;padding:0in'><span style='font-size:10.0pt;
font-family:LMRoman10-Regular;color:black'>mutex type. But no execution agent
shall hold a shared lock while another execution agent holds an exclusive </span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular'>lock on the same shared
mutex type, and vice-versa. The maximum number of execution agents which can</span></p>

<p class=MsoNormal style='text-autospace:none;border:none;padding:0in'><span
style='font-size:10.0pt;font-family:LMRoman10-Regular'>share a shared lock on a
single shared mutex type is unspecified, but shall be at least 10000. If more
than</span></p>

<p class=MsoNormal style='text-autospace:none;border:none;padding:0in'><span
style='font-size:10.0pt;font-family:LMRoman10-Regular'>the maximum number of
execution agents attempt to obtain a shared lock, the excess execution agents
shall</span></p>

<p class=MsoNormal style='text-autospace:none;border:none;padding:0in'><span
style='font-size:10.0pt;font-family:LMRoman10-Regular'>block until the number
of shared locks are reduced below the maximum amount by other execution agents</span></p>

<p class=MsoNormal style='text-autospace:none;border:none;padding:0in'><span
style='font-size:10.0pt;font-family:LMRoman10-Regular'>releasing their shared
lock.</span></p>

<p class=MsoNormal style='border:none;padding:0in'><span style='font-size:7.0pt;
font-family:LMRoman7-Regular'>3 </span><span style='font-size:10.0pt;
font-family:LMRoman10-Regular'>The expression </span><span style='font-size:
10.0pt;font-family:LMMono10-Regular'>m.lock_shared() </span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular'>shall be well-formed and
have the following semantics:</span></p>

<p class=MsoNormal style='border:none;padding:0in'><span style='font-size:6.0pt;
font-family:LMRoman10-Regular;color:black'></span></p>

<p class=MsoNormal style='border:none;padding:0in'><span style='font-size:7.0pt;
font-family:LMRoman7-Regular'>11 </span><span style='font-size:10.0pt;
font-family:LMRoman10-Regular'>The expression </span><span style='font-size:
10.0pt;font-family:LMMono10-Regular'>m.unlock_shared() </span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular'>shall be well-formed and
have the following semantics:</span></p>

<p class=MsoNormal style='border:none;padding:0in'><span style='font-size:6.0pt;
font-family:LMRoman10-Regular'></span></p>

<p class=MsoNormal style='border:none;padding:0in'><span style='font-size:7.0pt;
font-family:LMRoman7-Regular'>17 </span><span style='font-size:10.0pt;
font-family:LMRoman10-Regular'>The expression </span><span style='font-size:
10.0pt;font-family:LMMono10-Regular'>m.try_lock_shared() </span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular'>shall be well-formed and
have the following semantics:</span></p>

<p class=MsoNormal style='border:none;padding:0in'><span style='font-size:6.0pt;
font-family:LMRoman10-Regular'></span></p>

<p class=MsoNormal style='border:none;padding:0in'><span style='font-size:7.0pt;
font-family:LMRoman7-Regular'>23 </span><i><span style='font-size:10.0pt;
font-family:LMRoman10-Italic'>Throws: </span></i><span style='font-size:10.0pt;
font-family:LMRoman10-Regular'>Nothing.</span></p>

</div>

<p class=MsoNormal>&nbsp;</p>

<p class=MsoNormal>Insert a new section 30.4.1.4.1 [thread.sharedmutex.class]</p>

<p class=MsoNormal>&nbsp;</p>

<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><b><span
style='font-size:10.0pt;font-family:LMRoman10-Bold'>30.4.1.4.1 Class </span></b><b><span
style='font-size:10.0pt;font-family:LMMonoLt10-Bold'>shared_mutex </span></b><b><span
style='font-size:10.0pt;font-family:LMRoman10-Bold'>[thread.sharedmutex.class]</span></b></p>

<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='font-size:9.0pt;font-family:LMMono9-Regular'>namespace std {</span></p>

<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='font-size:9.0pt;font-family:LMMono9-Regular'> class shared_mutex {</span></p>

<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='font-size:9.0pt;font-family:LMMono9-Regular'> public:</span></p>

<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='font-size:9.0pt;font-family:LMMono9-Regular'> shared_mutex();</span></p>

<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='font-size:9.0pt;font-family:LMMono9-Regular'> ~shared_mutex();</span></p>

<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='font-size:9.0pt;font-family:LMMono9-Regular'>&nbsp;</span></p>

<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='font-size:9.0pt;font-family:LMMono9-Regular'> shared_mutex(const
shared_mutex&amp;) = delete;</span></p>

<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='font-size:9.0pt;font-family:LMMono9-Regular'> shared_mutex&amp;
operator=(const shared_mutex&amp;) = delete;</span></p>

<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='font-size:9.0pt;font-family:LMMono9-Regular'>&nbsp;</span></p>

<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><i><span
style='font-size:9.0pt;font-family:LMRoman9-Italic'> // Exclusive
ownership</span></i></p>

<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='font-size:9.0pt;font-family:LMMono9-Regular'> void lock(); </span><i><span
style='font-size:9.0pt;font-family:LMRoman9-Italic'>// blocking</span></i></p>

<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='font-size:9.0pt;font-family:LMMono9-Regular'> bool try_lock();</span></p>

<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='font-size:9.0pt;font-family:LMMono9-Regular'>&nbsp;</span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:9.0pt;
font-family:LMMono9-Regular'> </span><i><span
style='font-size:9.0pt;font-family:LMRoman9-Italic;color:black'>// Shared
ownership</span></i></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:9.0pt;
font-family:LMMono9-Regular;color:black'> void
lock_shared(); </span><i><span style='font-size:9.0pt;font-family:LMRoman9-Italic;
color:black'>// blocking</span></i></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:9.0pt;
font-family:LMMono9-Regular;color:black'> bool
try_lock_shared();</span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:9.0pt;
font-family:LMMono9-Regular;color:black'> void
unlock_shared();</span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:9.0pt;
font-family:LMMono9-Regular;color:black'> };</span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:9.0pt;
font-family:LMMono9-Regular;color:black'> }</span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;
font-family:LMRoman7-Regular;color:black'> 1 </span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular;color:black'>The class </span><span
style='font-size:10.0pt;font-family:LMMono10-Regular;color:black'>shared_mutex </span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular;color:black'>provides a
non-recursive mutex with shared ownership semantics.</span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;
font-family:LMRoman7-Regular;color:black'> 2 </span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular;color:black'>The class </span><span
style='font-size:10.0pt;font-family:LMMono10-Regular;color:black'>shared_mutex </span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular;color:black'>shall
satisfy all of the requirements for shared mutexes (</span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular;color:blue'>30.4.1.4</span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular;color:black'>). It shall</span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;
font-family:LMRoman10-Regular;color:black'> be a standard-layout
class (Clause </span><span style='font-size:10.0pt;font-family:LMRoman10-Regular;
color:blue'>9</span><span style='font-size:10.0pt;font-family:LMRoman10-Regular;
color:black'>).</span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:7.0pt;
font-family:LMRoman7-Regular;color:black'> 3 </span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular;color:black'>The behavior
of a program is undefined if:</span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;
font-family:LMRoman10-Regular;color:black'>  it destroys a </span><span
style='font-size:10.0pt;font-family:LMMono10-Regular;color:black'>shared_mutex </span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular;color:black'>object owned
by any thread,</span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;
font-family:LMRoman10-Regular;color:black'>  a thread attempts to
recursively gain any ownership of a </span><span style='font-size:10.0pt;
font-family:LMMono10-Regular;color:black'>shared_mutex</span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular;color:black'>.</span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;
font-family:LMRoman10-Regular;color:black'>  a thread terminates
while possessing any ownership of a </span><span style='font-size:10.0pt;
font-family:LMMono10-Regular;color:black'>shared_mutex</span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular;color:black'>.</span></p>

<p class=MsoNormal style='text-autospace:none'><span style='font-size:10.0pt;
font-family:LMRoman10-Regular;color:black'> </span><span
style='font-size:7.0pt;font-family:LMRoman7-Regular;color:black'>4 </span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular;color:black'>shared_mutex
may be a synonym for shared_timed_mutex</span></p>

<p class=MsoNormal>&nbsp;</p>

<p class=MsoNormal>Modify section [thread.sharedtimedmutex.requirements] as
follows</p>

<p class=MsoNormal>&nbsp;</p>

<p class=MsoNormal style='text-indent:.5in'><b><span style='font-size:10.0pt;
font-family:LMRoman10-Bold'>30.4.1.4<span style='background:lime'>.2</span>
Shared timed mutex types [thread.sharedtimedmutex.requirements]</span></b></p>

<p class=MsoNormal>&nbsp;</p>

<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='font-size:7.0pt;font-family:LMRoman7-Regular;color:black'>1 </span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular;color:black'>The standard
library type </span><span style='font-size:10.0pt;font-family:LMMono10-Regular;
color:black'>std::shared_timed_mutex </span><span style='font-size:10.0pt;
font-family:LMRoman10-Regular;color:black'>is a </span><i><span
style='font-size:10.0pt;font-family:LMRoman10-Italic;color:black'>shared timed
mutex type</span></i><span style='font-size:10.0pt;font-family:LMRoman10-Regular;
color:black'>. Shared timed mutex</span></p>

<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='font-size:10.0pt;font-family:LMRoman10-Regular;color:black'>types shall
meet the requirements of timed mutex types (</span><span style='font-size:10.0pt;
font-family:LMRoman10-Regular;color:blue'>30.4.1.3</span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular;color:black'>), <span
style='background:lime'>shared mutex types (</span></span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular;color:blue;background:
lime'>30.4.1.4</span><span style='font-size:10.0pt;font-family:LMRoman10-Regular;
color:black;background:lime'>),</span><span style='font-size:10.0pt;font-family:
LMRoman10-Regular;color:black'> and additionally shall meet the requirements
set out below. In this description, </span><span style='font-size:10.0pt;
font-family:LMMono10-Regular;color:black'>m </span><span style='font-size:10.0pt;
font-family:LMRoman10-Regular;color:black'>denotes an object of a mutex type, </span><span
style='font-size:10.0pt;font-family:LMMono10-Regular;color:black'>rel_type </span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular;color:black'>denotes an
object of an instantiation of </span><span style='font-size:10.0pt;font-family:
LMMono10-Regular;color:black'>duration </span><span style='font-size:10.0pt;
font-family:LMRoman10-Regular;color:black'>(</span><span style='font-size:10.0pt;
font-family:LMRoman10-Regular;color:blue'>20.12.5</span><span style='font-size:
10.0pt;font-family:LMRoman10-Regular;color:black'>), and </span><span
style='font-size:10.0pt;font-family:LMMono10-Regular;color:black'>abs_time </span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular;color:black'>denotes an
object of an instantiation of </span><span style='font-size:10.0pt;font-family:
LMMono10-Regular;color:black'>time_point </span><span style='font-size:10.0pt;
font-family:LMRoman10-Regular;color:black'>(</span><span style='font-size:10.0pt;
font-family:LMRoman10-Regular;color:blue'>20.12.6</span><span style='font-size:
10.0pt;font-family:LMRoman10-Regular;color:black'>).</span></p>

<p class=MsoNormal>&nbsp;</p>

<div style='border:solid windowtext 1.0pt;padding:1.0pt 4.0pt 1.0pt 4.0pt'>

<p class=MsoNormal style='border:none;padding:0in'><span style='color:black'>Note
to Editor, Clauses 2-23 were moved to section [</span>thread.sharedmutex.requirements]
per earlier edits, clauses<span style='color:black'> 24  37 remains </span>here
properly renumbered. </p>

</div>

<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt;
font-family:LMRoman10-Regular;color:black'>&nbsp;</span></p>

<p class=MsoNormal style='text-indent:.5in'><span style='font-size:10.0pt;
font-family:LMRoman10-Regular'>&nbsp;</span></p>

<div style='border:solid windowtext 1.0pt;padding:1.0pt 4.0pt 1.0pt 4.0pt;
margin-left:.5in;margin-right:0in'>

<p class=MsoNormal style='text-autospace:none;border:none;padding:0in'><span
style='font-size:7.0pt;font-family:LMRoman7-Regular'>Excerpt from clauses 24 
37 presented here for convenience of the reviewer.</span></p>

<p class=MsoNormal style='text-autospace:none;border:none;padding:0in'><span
style='font-size:7.0pt;font-family:LMRoman7-Regular'>&nbsp;</span></p>

<p class=MsoNormal style='text-autospace:none;border:none;padding:0in'><span
style='font-size:7.0pt;font-family:LMRoman7-Regular'>24 </span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular'>The expression </span><span
style='font-size:10.0pt;font-family:LMMono10-Regular'>m.try_lock_shared_for(rel_time)
</span><span style='font-size:10.0pt;font-family:LMRoman10-Regular'>shall be
well-formed and have the following semantics:<br>
</span><span style='font-size:7.0pt;font-family:LMRoman7-Regular'></span></p>

<p class=MsoNormal style='text-autospace:none;border:none;padding:0in'><span
style='font-size:7.0pt;font-family:LMRoman7-Regular;color:black'>30 </span><i><span
style='font-size:10.0pt;font-family:LMRoman10-Italic;color:black'>Throws: </span></i><span
style='font-size:10.0pt;font-family:LMRoman10-Regular;color:black'>Timeout-related
exceptions (</span><span style='font-size:10.0pt;font-family:LMRoman10-Regular;
color:blue'>30.2.4</span><span style='font-size:10.0pt;font-family:LMRoman10-Regular;
color:black'>).</span></p>

<p class=MsoNormal style='text-autospace:none;border:none;padding:0in'><span
style='font-size:10.0pt;font-family:LMRoman10-Regular;color:black'>&nbsp;</span></p>

<p class=MsoNormal style='text-autospace:none;border:none;padding:0in'><span
style='font-size:7.0pt;font-family:LMRoman7-Regular;color:black'>31 </span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular;color:black'>The
expression </span><span style='font-size:10.0pt;font-family:LMMono10-Regular;
color:black'>m.try_lock_shared_until(abs_time) </span><span style='font-size:
10.0pt;font-family:LMRoman10-Regular;color:black'>shall be well-formed and have
the following semantics: </span></p>

<p class=MsoNormal style='border:none;padding:0in'><span style='font-size:10.0pt;
font-family:LMRoman10-Regular;color:black'><br>
</span><span style='font-size:7.0pt;font-family:LMRoman7-Regular;color:black'>37
</span><i><span style='font-size:10.0pt;font-family:LMRoman10-Italic;
color:black'>Throws: </span></i><span style='font-size:10.0pt;font-family:LMRoman10-Regular;
color:black'>Timeout-related exceptions (</span><span style='font-size:10.0pt;
font-family:LMRoman10-Regular;color:blue'>30.2.4</span><span style='font-size:
10.0pt;font-family:LMRoman10-Regular;color:black'>).</span></p>

</div>

<p class=MsoNormal>&nbsp;</p>

<p class=MsoNormal>Modify section 30.4.1.4.1 [thread.sharedtimedmutex.class] as
follows:</p>

<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><span
style='font-size:9.0pt;font-family:"Lucida Console"'>&nbsp;</span></p>

<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><b><span
style='font-size:10.0pt;font-family:LMRoman10-Bold'>30.4.1.4.<s><span
style='background:red'>1</span></s><span style='background:lime'>3</span> Class
</span></b><b><span style='font-size:10.0pt;font-family:LMMonoLt10-Bold'>shared_timed_mutex
</span></b><b><span style='font-size:10.0pt;font-family:LMRoman10-Bold'>[thread.sharedtimedmutex.class]</span></b></p>

<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><b><span
style='font-size:10.0pt;font-family:LMRoman10-Bold'>&nbsp;</span></b></p>

<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><b><span
style='font-size:10.0pt;font-family:LMRoman10-Bold'></span></b></p>

<p class=MsoNormal style='margin-left:.5in;text-autospace:none'><b><span
style='font-size:10.0pt;font-family:LMRoman10-Bold'>&nbsp;</span></b></p>

<p class=MsoNormal style='text-indent:.5in;text-autospace:none'><span
style='font-size:7.0pt;font-family:LMRoman7-Regular;color:black'>2 </span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular;color:black'>The class </span><span
style='font-size:10.0pt;font-family:LMMono10-Regular;color:black'>shared_timed_mutex
</span><span style='font-size:10.0pt;font-family:LMRoman10-Regular;color:black'>shall
satisfy all of the </span><s><span style='font-size:10.0pt;font-family:LMMono10-Regular;
color:black;background:red'>SharedTimedMutex </span></s><s><span
style='font-size:10.0pt;font-family:LMRoman10-Regular;color:black;background:
red'>requirements (</span></s><s><span style='font-size:10.0pt;font-family:
LMRoman10-Regular;color:blue;background:red'>30.4.1.4</span></s><s><span
style='font-size:10.0pt;font-family:LMRoman10-Regular;color:black;background:
red'>).</span></s><span style='font-size:10.0pt;font-family:LMRoman10-Regular;
color:black'> </span></p>

<p class=MsoNormal style='text-indent:.5in;text-autospace:none'><span
style='font-size:10.0pt;font-family:LMRoman10-Regular;color:black'> <span
style='background:lime'>requirements for shared timed mutexes (</span></span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular;color:blue;background:
lime'>30.4.1.4.2</span><span style='font-size:10.0pt;font-family:LMRoman10-Regular;
color:black;background:lime'>).</span><span style='font-size:10.0pt;font-family:
LMRoman10-Regular;color:black'> It shall be a standard-layout class (Clause </span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular;color:blue'>9</span><span
style='font-size:10.0pt;font-family:LMRoman10-Regular;color:black'>).</span></p>

<h1><a name="_Toc381263083">Acknowledgements</a></h1>

<p class=MsoNormal>Many thanks to Artur Laksberg, James McNellis and Stephan T.
Lavavej for their feedback and review. </p>

</div>

</body>

</html>
