*/ } ul /* Whole unordered list */ { } ul li /* Unordered list item */ { } ol /* Whole ordered list */ { } ol li /* Ordered list item */ { } hr {} /* ---- Some span elements --- */ sub /* Subscripts. Pandoc: H~2~O */ { } sup /* Superscripts. Pandoc: The 2^nd^ try. */ { } em /* Emphasis. Markdown: *emphasis* or _emphasis_ */ { } em > em /* Emphasis within emphasis: *This is all *emphasized* except that* */ { font-style: normal; } blockquote > p > em /* Emphasis within emphasis: *This is all *emphasized* except that* */ { font-style: normal; } blockquote > * > p > em /* Emphasis within emphasis: *This is all *emphasized* except that* */ { font-style: normal; } blockquote > p > ins > em /* Emphasis within emphasis: *This is all *emphasized* except that* */ { font-style: normal; } blockquote > * > p > ins > em /* Emphasis within emphasis: *This is all *emphasized* except that* */ { font-style: normal; } /* ---- Links (anchors) ---- */ a /* All links */ { /* Keep links clean. On screen, they are colored; in print, they do nothing anyway. */ text-decoration: none; } @media screen { a:hover { /* On hover, we indicate a bit more that it is a link. */ text-decoration: underline; } } @media print { a { /* In print, a colored link is useless, so un-style it. */ color: black; background: transparent; } a[href^="http://"]:after, a[href^="https://"]:after { /* However, links that go somewhere else, might be useful to the reader, so for http and https links, print the URL after what was the link text in parens */ content: " (" attr(href) ") "; font-size: 90%; } } /* ---- Images ---- */ img { /* Let it be inline left/right where it wants to be, but verticality make it in the middle to look nicer, but opinions differ, and if in a multi-line paragraph, it might not be so great. */ vertical-align: middle; } div.figure /* Pandoc figure-style image */ { /* Center the image and caption */ margin-left: auto; margin-right: auto; text-align: center; font-style: italic; } p.caption /* Pandoc figure-style caption within div.figure */ { /* Inherits div.figure props by default */ } /* ---- Code blocks and spans ---- */ pre, code { background-color: #fdf7ee; /* BEGIN word wrap */ /* Need all the following to word wrap instead of scroll box */ /* This will override the overflow:auto if present */ white-space: pre-wrap; /* css-3 */ white-space: -moz-pre-wrap !important; /* Mozilla, since 1999 */ white-space: -pre-wrap; /* Opera 4-6 */ white-space: -o-pre-wrap; /* Opera 7 */ word-wrap: break-word; /* Internet Explorer 5.5+ */ /* END word wrap */ } pre /* Code blocks */ { /* Distinguish pre blocks from other text by more than the font with a background tint. */ padding: 0.5em; /* Since we have a background color */ border-radius: 5px; /* Softens it */ /* Give it a some definition */ border: 1px solid #aaa; /* Set it off left and right, seems to look a bit nicer when we have a background */ margin-left: 0.5em; margin-right: 0.5em; } pre.yacc, code.yacc { background-color: #f0f0f0; } pre.yacc /* Code blocks */ { /* Distinguish pre blocks from other text by more than the font with a background tint. */ padding: 0.0em; /* Since we have a background color */ border-radius: 5px; /* Softens it */ /* Give it a some definition */ border: 0px solid #aaa; /* Set it off left and right, seems to look a bit nicer when we have a background */ margin-left: 0.0em; margin-right: 0.0em; } @media screen { pre { white-space: pre; /* Dotted looks better on screen and solid seems to print better. */ border: 1px dotted #777; } } code /* All inline code spans */ { } p > code, li > code /* Code spans in paragraphs and tight lists */ { /* Pad a little from adjacent text */ padding-left: 2px; padding-right: 2px; } li > p code /* Code span in a loose list */ { /* We have room for some more background color above and below */ padding: 2px; } span.option { color: blue; text-decoration: underline; } /* ---- Math ---- */ span.math /* Pandoc inline math default and --jsmath inline math */ { /* Tried font-style:italic here, and it messed up MathJax rendering in some browsers. Maybe don't mess with at all. */ } div.math /* Pandoc --jsmath display math */ { } span.LaTeX /* Pandoc --latexmathml math */ { } eq /* Pandoc --gladtex math */ { } /* ---- Tables ---- */ /* A clean textbook-like style with horizontal lines above and below and under the header. Rows highlight on hover to help scanning the table on screen. */ table { border-collapse: collapse; border-spacing: 0; /* IE 6 */ border-bottom: 2pt solid #000; border-top: 2pt solid #000; /* The caption on top will not have a bottom-border */ /* Center */ margin-left: auto; margin-right: auto; } thead /* Entire table header */ { border-bottom: 1pt solid #000; background-color: #eee; /* Does this BG print well? */ } tr.header /* Each header row */ { } tbody /* Entire table body */ { } /* Table body rows */ tr { } tr.odd:hover, tr.even:hover /* Use .odd and .even classes to avoid styling rows in other tables */ { background-color: #eee; } /* Odd and even rows */ tr.odd {} tr.even {} td, th /* Table cells and table header cells */ { vertical-align: top; /* Word */ vertical-align: baseline; /* Others */ padding-left: 0.5em; padding-right: 0.5em; padding-top: 0.2em; padding-bottom: 0.2em; } /* Removes padding on left and right of table for a tight look. Good if thead has no background color*/ /* tr td:last-child, tr th:last-child { padding-right: 0; } tr td:first-child, tr th:first-child { padding-left: 0; } */ th /* Table header cells */ { font-weight: bold; } tfoot /* Table footer (what appears here if caption is on top?) */ { } caption /* This is for a table caption tag, not the p.caption Pandoc uses in a div.figure */ { caption-side: top; border: none; font-size: 0.9em; font-style: italic; text-align: center; margin-bottom: 0.3em; /* Good for when on top */ padding-bottom: 0.2em; } /* ---- Definition lists ---- */ dl /* The whole list */ { border-top: 2pt solid black; padding-top: 0.5em; border-bottom: 2pt solid black; } dt /* Definition term */ { font-weight: bold; } dd+dt /* 2nd or greater term in the list */ { border-top: 1pt solid black; padding-top: 0.5em; } dd /* A definition */ { margin-bottom: 0.5em; } dd+dd /* 2nd or greater definition of a term */ { border-top: 1px solid black; /* To separate multiple definitions */ } /* ---- Footnotes ---- */ a.footnote, a.footnoteRef { /* Pandoc, MultiMarkdown footnote links */ font-size: small; vertical-align: text-top; } a[href^="#fnref"], a.reversefootnote /* Pandoc, MultiMarkdown, ?? footnote back links */ { } @media print { a[href^="#fnref"], a.reversefootnote /* Pandoc, MultiMarkdown */ { /* Don't display these at all in print since the arrow is only something to click on */ display: none; } } div.footnotes /* Pandoc footnotes div at end of the document */ { } div.footnotes li[id^="fn"] /* A footnote item within that div */ { } table tr td,th { border-right: 1px solid; border-left: 1px solid; } /* You can class stuff as "noprint" to not print. Useful since you can't set this media conditional inside an HTML element's style attribute (I think), and you don't want to make another stylesheet that imports this one and adds a class just to do this. */ @media print { .noprint { display:none; } }
2025-05-28
integration into IS ISO/IEC 9899:202y
document number | date | comment |
---|---|---|
n3559 | 202505 | this document |
The two wait
funtions for
conditional variables use non-binding terminology to describe a
requirement. For example they claim that these functions would “require”
the passed-in mutex to be locked. The use of such wording is not binding
normatively.
Additionally, the text claims that the mutex is unlocked when such a
function is entered and re-locked when the call finishes. It is not
specified, how this “locking” behaves with respect to the other
functions on mtx_t
and with
respect to the “synchronized by” relation.
There is no indication that this even has caused confusion in implementations. Nevertheless, we think that some housekeeping is in order.
This paper is not intended to make a normative change.
Note that the defects that are treated in this paper here seem not have been discussed before by WG14. Therefore they are not included in n3542 but are proposed in a separate paper.
In general, there is no way that a compiler can know if a specific mutex is already locked when entering into a wait for a conditional variable. Therefore we suggest that the only reasonable specification here is to have UB if the mutex is not locked. The simplest way is to use “shall” to make this normative.
Also it is currently claimed that when it is destroyed, it “requires” that no thread be blocked. We think that what is meant here is that no other thread should be using the same condition variable while it is destroyed. This is best state that such uses lead to a data race.
These UBs seems to have been below the radar for now, so we suggest that corresponding items are added to J .2.
The simplest way to ensure that these wait
calls are suitably integrated into the
mechanisms described for mtx_t
is to claim
that the unlocking and then re-locking behaves as if by calls to mtx_unlock
and mtx_lock
. Claiming so is consistent with
POSIX pthread_cond_t
and pthread_mutex_t
, which had been the model
for this feature when introduced in C11. We also then add explicit text
that specifies the synchronization properties.
New text is underlined green, removed text is
stroke-out red.
7.30.3.2 The cnd_destroy function
…
2 The
cnd_destroy
function releases all resources used by the condition variable pointed to bycond
.TheConcurrent access to the condition variable being destroyed constitutes a data race.cnd_destroy
function requires that no threads be blocked waiting for the condition variable pointed to bycond
.
…
7.30.3.5 The cnd_timedwait function
…
2 The
cnd_timedwait function
atomically unlocks the mutex pointed to bymtx
(as if bymtx_unlock
) and blocks until the condition variable pointed to bycond
is signaled by a call tocnd_signal
or tocnd_broadcast
, or until after theTIME_UTC
-based calendar time pointed to byts
, or until it is unblocked due to an unspecified reason. When the calling thread becomes unblocked it locks (as if bymtx_lock
) the object pointed to bymtx
before it returns.ThePrior to the call, the mutex pointed to bycnd_timedwait function
requires thatmtx
shall be locked by the calling thread. Entry and completion of calls with the same mutex pointed to bymtx
synchronize as if by calls tomtx_unlock
andmtx_lock
, respectively.
7.30.3.6 The cnd_wait function
…
The
cnd_wait
function atomically unlocks the mutex pointed to bymtx
(as if bymtx_unlock
) and blocks until the condition variable pointed to bycond
is signaled by a call tocnd_signal
or tocnd_broadcast
, or until it is unblocked due to an unspecified reason. When the calling thread becomes unblocked it locks the mutex pointed to bymtx
(as if bymtx_lock
) before it returns.ThePrior to the call, the mutex pointed to bycnd_wait function
requires thatmtx
shall be locked by the calling thread. Entry and completion of calls with the same mutex pointed to bymtx
synchronize as if by calls tomtx_unlock
andmtx_lock
, respectively.
Add at an appropriate point in the list
- A condition variable is otherwise in use while it is destroyed by a call to
cnd_destroy
(7.30.3.2).
- The mutex passed to
cnd_timedwait
orcnd_wait
is not locked by the calling thread (7.30.3.5, 7.30.3.6).
The wording changes have been integrated into the standard source in the following branch:
https://gitlab.gwdg.de/iso-c/draft/-/tree/cnd_t