|
39 | 39 | \Cpp is a general purpose programming language based on the C
|
40 | 40 | programming language as described in ISO/IEC 9899:2011
|
41 | 41 | \doccite{Programming languages --- C} (hereinafter referred to as the
|
42 |
| -\indexdefn{C!standard}\term{C standard}). In addition to |
| 42 | +\defnx{C standard}{C!standard}). In addition to |
43 | 43 | the facilities provided by C, \Cpp provides additional data types,
|
44 | 44 | classes, templates, exceptions, namespaces, operator
|
45 | 45 | overloading, function name overloading, references, free store
|
|
548 | 548 | occupies storage in the way that objects do. \end{note}
|
549 | 549 | The properties of an
|
550 | 550 | object are determined when the object is created. An object can have a
|
551 |
| -\term{name}~(Clause~\ref{basic}). An object has a \term{storage |
552 |
| -duration}~(\ref{basic.stc}) which influences its |
553 |
| -\term{lifetime}~(\ref{basic.life}). An object has a |
554 |
| -\term{type}~(\ref{basic.types}). The term \defn{object type} refers to |
| 551 | +name~(Clause~\ref{basic}). An object has a storage |
| 552 | +duration~(\ref{basic.stc}) which influences its |
| 553 | +lifetime~(\ref{basic.life}). An object has a |
| 554 | +type~(\ref{basic.types}). The term \defn{object type} refers to |
555 | 555 | the type with which the object is created.
|
556 | 556 | Some objects are
|
557 |
| -\term{polymorphic}~(\ref{class.virtual}); the implementation |
| 557 | +polymorphic~(\ref{class.virtual}); the implementation |
558 | 558 | generates information associated with each such object that makes it
|
559 | 559 | possible to determine that object's type during program execution. For
|
560 | 560 | other objects, the interpretation of the values found therein is
|
|
950 | 950 | \pnum
|
951 | 951 | \defn{Sequenced before} is an asymmetric, transitive, pair-wise relation between
|
952 | 952 | evaluations executed by a single thread~(\ref{intro.multithread}), which induces
|
953 |
| -a partial order among those evaluations. Given any two evaluations \term{A} and |
954 |
| -\term{B}, if \term{A} is sequenced before \term{B} |
955 |
| -(or, equivalently, \term{B} is \defn{sequenced after} \term{A}), |
| 953 | +a partial order among those evaluations. Given any two evaluations \placeholder{A} and |
| 954 | +\placeholder{B}, if \placeholder{A} is sequenced before \placeholder{B} |
| 955 | +(or, equivalently, \placeholder{B} is \defn{sequenced after} \placeholder{A}), |
956 | 956 | then the execution of
|
957 |
| -\term{A} shall precede the execution of \term{B}. If \term{A} is not sequenced |
958 |
| -before \term{B} and \term{B} is not sequenced before \term{A}, then \term{A} and |
959 |
| -\term{B} are \defn{unsequenced}. \begin{note} The execution of unsequenced |
960 |
| -evaluations can overlap. \end{note} Evaluations \term{A} and \term{B} are |
961 |
| -\defn{indeterminately sequenced} when either \term{A} is sequenced before |
962 |
| -\term{B} or \term{B} is sequenced before \term{A}, but it is unspecified which. |
| 957 | +\placeholder{A} shall precede the execution of \placeholder{B}. If \placeholder{A} is not sequenced |
| 958 | +before \placeholder{B} and \placeholder{B} is not sequenced before \placeholder{A}, then \placeholder{A} and |
| 959 | +\placeholder{B} are \defn{unsequenced}. \begin{note} The execution of unsequenced |
| 960 | +evaluations can overlap. \end{note} Evaluations \placeholder{A} and \placeholder{B} are |
| 961 | +\defn{indeterminately sequenced} when either \placeholder{A} is sequenced before |
| 962 | +\placeholder{B} or \placeholder{B} is sequenced before \placeholder{A}, but it is unspecified which. |
963 | 963 | \begin{note} Indeterminately sequenced evaluations cannot overlap, but either
|
964 | 964 | could be executed first. \end{note}
|
965 | 965 | An expression \placeholder{X}
|
|
1027 | 1027 | expression, or with the postfix expression designating the called
|
1028 | 1028 | function, is sequenced before execution of every expression or statement
|
1029 | 1029 | in the body of the called function.
|
1030 |
| -For each function invocation \term{F}, |
1031 |
| -for every evaluation \term{A} that occurs within \term{F} and |
1032 |
| -every evaluation \term{B} that does not occur within \term{F} but |
| 1030 | +For each function invocation \placeholder{F}, |
| 1031 | +for every evaluation \placeholder{A} that occurs within \placeholder{F} and |
| 1032 | +every evaluation \placeholder{B} that does not occur within \placeholder{F} but |
1033 | 1033 | is evaluated on the same thread and as part of the same signal handler (if any),
|
1034 |
| -either \term{A} is sequenced before \term{B} or |
1035 |
| -\term{B} is sequenced before \term{A}. |
| 1034 | +either \placeholder{A} is sequenced before \placeholder{B} or |
| 1035 | +\placeholder{B} is sequenced before \placeholder{A}. |
1036 | 1036 | \footnote{In other words, function executions do not interleave with
|
1037 | 1037 | each other.}
|
1038 | 1038 | \begin{note}
|
1039 |
| -If \term{A} and \term{B} would not otherwise be sequenced then they are |
| 1039 | +If \placeholder{A} and \placeholder{B} would not otherwise be sequenced then they are |
1040 | 1040 | indeterminately sequenced.
|
1041 | 1041 | \end{note}
|
1042 | 1042 | Several contexts in \Cpp cause evaluation of a function call, even
|
|
1088 | 1088 | \rSec2[intro.races]{Data races}
|
1089 | 1089 |
|
1090 | 1090 | \pnum
|
1091 |
| -The value of an object visible to a thread \term{T} at a particular point is the |
1092 |
| -initial value of the object, a value assigned to the object by \term{T}, or a |
| 1091 | +The value of an object visible to a thread \placeholder{T} at a particular point is the |
| 1092 | +initial value of the object, a value assigned to the object by \placeholder{T}, or a |
1093 | 1093 | value assigned to the object by another thread, according to the rules below.
|
1094 | 1094 | \begin{note} In some cases, there may instead be undefined behavior. Much of this
|
1095 | 1095 | section is motivated by the desire to support atomic operations with explicit
|
|
1116 | 1116 | perform an acquire operation on the locations comprising the mutex.
|
1117 | 1117 | Correspondingly, a call that releases the same mutex will perform a release
|
1118 | 1118 | operation on those same locations. Informally, performing a release operation on
|
1119 |
| -\term{A} forces prior |
| 1119 | +\placeholder{A} forces prior |
1120 | 1120 | \indextext{side effects}%
|
1121 | 1121 | side effects on other memory locations to become visible
|
1122 | 1122 | to other threads that later perform a consume or an acquire operation on
|
1123 |
| -\term{A}. ``Relaxed'' atomic operations are not synchronization operations even |
| 1123 | +\placeholder{A}. ``Relaxed'' atomic operations are not synchronization operations even |
1124 | 1124 | though, like synchronization operations, they cannot contribute to data races.
|
1125 | 1125 | \end{note}
|
1126 | 1126 |
|
1127 | 1127 | \pnum
|
1128 |
| -All modifications to a particular atomic object \term{M} occur in some |
1129 |
| -particular total order, called the \defn{modification order} of \term{M}. |
| 1128 | +All modifications to a particular atomic object \placeholder{M} occur in some |
| 1129 | +particular total order, called the \defn{modification order} of \placeholder{M}. |
1130 | 1130 | \begin{note} There is a separate order for each
|
1131 | 1131 | atomic object. There is no requirement that these can be combined into a single
|
1132 | 1132 | total order for all objects. In general this will be impossible since different
|
1133 | 1133 | threads may observe modifications to different objects in inconsistent orders.
|
1134 | 1134 | \end{note}
|
1135 | 1135 |
|
1136 | 1136 | \pnum
|
1137 |
| -A \defn{release sequence} headed by a release operation \term{A} on an atomic object |
1138 |
| -\term{M} is a maximal contiguous sub-sequence of |
| 1137 | +A \defn{release sequence} headed by a release operation \placeholder{A} on an atomic object |
| 1138 | +\placeholder{M} is a maximal contiguous sub-sequence of |
1139 | 1139 | \indextext{side effects}%
|
1140 | 1140 | side effects in the
|
1141 |
| -modification order of \term{M}, where the first operation is \tcode{A}, and |
| 1141 | +modification order of \placeholder{M}, where the first operation is \tcode{A}, and |
1142 | 1142 | every subsequent operation
|
1143 | 1143 |
|
1144 | 1144 | \begin{itemize}
|
|
1159 | 1159 | the value written'' by the last mutex release. \end{note}
|
1160 | 1160 |
|
1161 | 1161 | \pnum
|
1162 |
| -An evaluation \term{A} \defn{carries a dependency} to an evaluation \term{B} if |
| 1162 | +An evaluation \placeholder{A} \defn{carries a dependency} to an evaluation \placeholder{B} if |
1163 | 1163 |
|
1164 | 1164 | \begin{itemize}
|
1165 | 1165 |
|
1166 | 1166 | \item
|
1167 |
| -the value of \term{A} is used as an operand of \term{B}, unless: |
| 1167 | +the value of \placeholder{A} is used as an operand of \placeholder{B}, unless: |
1168 | 1168 | \begin{itemize}
|
1169 | 1169 |
|
1170 | 1170 | \item
|
1171 |
| -\term{B} is an invocation of any specialization of |
| 1171 | +\placeholder{B} is an invocation of any specialization of |
1172 | 1172 | \tcode{std::kill_dependency}~(\ref{atomics.order}), or
|
1173 | 1173 |
|
1174 | 1174 | \item
|
1175 |
| -\term{A} is the left operand of a built-in logical AND (\tcode{\&\&}, |
| 1175 | +\placeholder{A} is the left operand of a built-in logical AND (\tcode{\&\&}, |
1176 | 1176 | see~\ref{expr.log.and}) or logical OR (\tcode{||}, see~\ref{expr.log.or})
|
1177 | 1177 | operator, or
|
1178 | 1178 |
|
1179 | 1179 | \item
|
1180 |
| -\term{A} is the left operand of a conditional (\tcode{?:}, see~\ref{expr.cond}) |
| 1180 | +\placeholder{A} is the left operand of a conditional (\tcode{?:}, see~\ref{expr.cond}) |
1181 | 1181 | operator, or
|
1182 | 1182 |
|
1183 | 1183 | \item
|
1184 |
| -\term{A} is the left operand of the built-in comma (\tcode{,}) |
| 1184 | +\placeholder{A} is the left operand of the built-in comma (\tcode{,}) |
1185 | 1185 | operator~(\ref{expr.comma}); \end{itemize} or
|
1186 | 1186 |
|
1187 | 1187 | \item
|
1188 |
| -\term{A} writes a scalar object or bit-field \term{M}, \term{B} reads the value |
1189 |
| -written by \term{A} from \term{M}, and \term{A} is sequenced before \term{B}, or |
| 1188 | +\placeholder{A} writes a scalar object or bit-field \placeholder{M}, \placeholder{B} reads the value |
| 1189 | +written by \placeholder{A} from \placeholder{M}, and \placeholder{A} is sequenced before \placeholder{B}, or |
1190 | 1190 |
|
1191 | 1191 | \item
|
1192 |
| -for some evaluation \term{X}, \term{A} carries a dependency to \term{X}, and |
1193 |
| -\term{X} carries a dependency to \term{B}. |
| 1192 | +for some evaluation \placeholder{X}, \placeholder{A} carries a dependency to \placeholder{X}, and |
| 1193 | +\placeholder{X} carries a dependency to \placeholder{B}. |
1194 | 1194 |
|
1195 | 1195 | \end{itemize}
|
1196 | 1196 |
|
1197 | 1197 | \begin{note} ``Carries a dependency to'' is a subset of ``is sequenced before'',
|
1198 | 1198 | and is similarly strictly intra-thread. \end{note}
|
1199 | 1199 |
|
1200 | 1200 | \pnum
|
1201 |
| -An evaluation \term{A} is \defn{dependency-ordered before} an evaluation |
1202 |
| -\term{B} if |
| 1201 | +An evaluation \placeholder{A} is \defn{dependency-ordered before} an evaluation |
| 1202 | +\placeholder{B} if |
1203 | 1203 | \begin{itemize}
|
1204 | 1204 |
|
1205 | 1205 | \item
|
1206 |
| -\term{A} performs a release operation on an atomic object \term{M}, and, in |
1207 |
| -another thread, \term{B} performs a consume operation on \term{M} and reads a |
| 1206 | +\placeholder{A} performs a release operation on an atomic object \placeholder{M}, and, in |
| 1207 | +another thread, \placeholder{B} performs a consume operation on \placeholder{M} and reads a |
1208 | 1208 | value written by any
|
1209 | 1209 | \indextext{side effects}%
|
1210 |
| -side effect in the release sequence headed by \term{A}, or |
| 1210 | +side effect in the release sequence headed by \placeholder{A}, or |
1211 | 1211 |
|
1212 | 1212 | \item
|
1213 |
| -for some evaluation \term{X}, \term{A} is dependency-ordered before \term{X} and |
1214 |
| -\term{X} carries a dependency to \term{B}. |
| 1213 | +for some evaluation \placeholder{X}, \placeholder{A} is dependency-ordered before \placeholder{X} and |
| 1214 | +\placeholder{X} carries a dependency to \placeholder{B}. |
1215 | 1215 |
|
1216 | 1216 | \end{itemize}
|
1217 | 1217 | \begin{note} The relation ``is dependency-ordered before'' is analogous to
|
1218 | 1218 | ``synchronizes with'', but uses release/consume in place of release/acquire.
|
1219 | 1219 | \end{note}
|
1220 | 1220 |
|
1221 | 1221 | \pnum
|
1222 |
| -An evaluation \term{A} \defn{inter-thread happens before} an evaluation \term{B} |
| 1222 | +An evaluation \placeholder{A} \defn{inter-thread happens before} an evaluation \placeholder{B} |
1223 | 1223 | if
|
1224 | 1224 |
|
1225 | 1225 | \begin{itemize}
|
1226 | 1226 |
|
1227 | 1227 | \item
|
1228 |
| -\term{A} synchronizes with \term{B}, or |
| 1228 | +\placeholder{A} synchronizes with \placeholder{B}, or |
1229 | 1229 |
|
1230 | 1230 | \item
|
1231 |
| -\term{A} is dependency-ordered before \term{B}, or |
| 1231 | +\placeholder{A} is dependency-ordered before \placeholder{B}, or |
1232 | 1232 |
|
1233 | 1233 | \item
|
1234 |
| -for some evaluation \term{X} |
| 1234 | +for some evaluation \placeholder{X} |
1235 | 1235 |
|
1236 | 1236 | \begin{itemize}
|
1237 | 1237 | \item
|
1238 |
| -\term{A} synchronizes with \term{X} and \term{X} is sequenced before \term{B}, |
| 1238 | +\placeholder{A} synchronizes with \placeholder{X} and \placeholder{X} is sequenced before \placeholder{B}, |
1239 | 1239 | or
|
1240 | 1240 |
|
1241 | 1241 | \item
|
1242 |
| -\term{A} is sequenced before \term{X} and \term{X} inter-thread happens before |
1243 |
| -\term{B}, or |
| 1242 | +\placeholder{A} is sequenced before \placeholder{X} and \placeholder{X} inter-thread happens before |
| 1243 | +\placeholder{B}, or |
1244 | 1244 |
|
1245 | 1245 | \item
|
1246 |
| -\term{A} inter-thread happens before \term{X} and \term{X} inter-thread happens |
1247 |
| -before \term{B}. |
| 1246 | +\placeholder{A} inter-thread happens before \placeholder{X} and \placeholder{X} inter-thread happens |
| 1247 | +before \placeholder{B}. |
1248 | 1248 | \end{itemize}
|
1249 | 1249 | \end{itemize}
|
1250 | 1250 |
|
|
1265 | 1265 | relationships consisting entirely of ``sequenced before''. \end{note}
|
1266 | 1266 |
|
1267 | 1267 | \pnum
|
1268 |
| -An evaluation \term{A} \defn{happens before} an evaluation \term{B} |
1269 |
| -(or, equivalently, \term{B} \defn{happens after} \term{A}) if: |
| 1268 | +An evaluation \placeholder{A} \defn{happens before} an evaluation \placeholder{B} |
| 1269 | +(or, equivalently, \placeholder{B} \defn{happens after} \placeholder{A}) if: |
1270 | 1270 |
|
1271 | 1271 | \begin{itemize}
|
1272 |
| -\item \term{A} is sequenced before \term{B}, or |
1273 |
| -\item \term{A} inter-thread happens before \term{B}. |
| 1272 | +\item \placeholder{A} is sequenced before \placeholder{B}, or |
| 1273 | +\item \placeholder{A} inter-thread happens before \placeholder{B}. |
1274 | 1274 | \end{itemize}
|
1275 | 1275 |
|
1276 | 1276 | The implementation shall ensure that no program execution demonstrates a cycle
|
1277 | 1277 | in the ``happens before'' relation. \begin{note} This cycle would otherwise be
|
1278 | 1278 | possible only through the use of consume operations. \end{note}
|
1279 | 1279 |
|
1280 | 1280 | \pnum
|
1281 |
| -A \defnx{visible side effect}{side effects!visible} \term{A} on a scalar object or bit-field \term{M} |
1282 |
| -with respect to a value computation \term{B} of \term{M} satisfies the |
| 1281 | +A \defnx{visible side effect}{side effects!visible} \placeholder{A} on a scalar object or bit-field \placeholder{M} |
| 1282 | +with respect to a value computation \placeholder{B} of \placeholder{M} satisfies the |
1283 | 1283 | conditions:
|
1284 | 1284 |
|
1285 | 1285 | \begin{itemize}
|
1286 |
| -\item \term{A} happens before \term{B} and |
| 1286 | +\item \placeholder{A} happens before \placeholder{B} and |
1287 | 1287 | \item there is no other
|
1288 | 1288 | \indextext{side effects}%
|
1289 |
| -side effect \term{X} to \term{M} such that \term{A} |
1290 |
| -happens before \term{X} and \term{X} happens before \term{B}. |
| 1289 | +side effect \placeholder{X} to \placeholder{M} such that \placeholder{A} |
| 1290 | +happens before \placeholder{X} and \placeholder{X} happens before \placeholder{B}. |
1291 | 1291 | \end{itemize}
|
1292 | 1292 |
|
1293 |
| -The value of a non-atomic scalar object or bit-field \term{M}, as determined by |
1294 |
| -evaluation \term{B}, shall be the value stored by the |
| 1293 | +The value of a non-atomic scalar object or bit-field \placeholder{M}, as determined by |
| 1294 | +evaluation \placeholder{B}, shall be the value stored by the |
1295 | 1295 | \indextext{side effects!visible}%
|
1296 | 1296 | visible side effect
|
1297 |
| -\term{A}. \begin{note} If there is ambiguity about which side effect to a |
| 1297 | +\placeholder{A}. \begin{note} If there is ambiguity about which side effect to a |
1298 | 1298 | non-atomic object or bit-field is visible, then the behavior is either
|
1299 | 1299 | unspecified or undefined. \end{note} \begin{note} This states that operations on
|
1300 | 1300 | ordinary objects are not visibly reordered. This is not actually detectable
|
|
1304 | 1304 |
|
1305 | 1305 | \pnum
|
1306 | 1306 | The value of an
|
1307 |
| -atomic object \term{M}, as determined by evaluation \term{B}, shall be the value |
| 1307 | +atomic object \placeholder{M}, as determined by evaluation \placeholder{B}, shall be the value |
1308 | 1308 | stored by some
|
1309 |
| -side effect \term{A} that modifies \term{M}, where \term{B} does not happen |
1310 |
| -before \term{A}. |
| 1309 | +side effect \placeholder{A} that modifies \placeholder{M}, where \placeholder{B} does not happen |
| 1310 | +before \placeholder{A}. |
1311 | 1311 | \begin{note}
|
1312 | 1312 | The set of such side effects is also restricted by the rest of the rules
|
1313 | 1313 | described here, and in particular, by the coherence requirements below.
|
1314 | 1314 | \end{note}
|
1315 | 1315 |
|
1316 | 1316 | \pnum
|
1317 |
| -If an operation \term{A} that modifies an atomic object \term{M} happens before |
1318 |
| -an operation \term{B} that modifies \term{M}, then \term{A} shall be earlier |
1319 |
| -than \term{B} in the modification order of \term{M}. \begin{note} This requirement |
| 1317 | +If an operation \placeholder{A} that modifies an atomic object \placeholder{M} happens before |
| 1318 | +an operation \placeholder{B} that modifies \placeholder{M}, then \placeholder{A} shall be earlier |
| 1319 | +than \placeholder{B} in the modification order of \placeholder{M}. \begin{note} This requirement |
1320 | 1320 | is known as write-write coherence. \end{note}
|
1321 | 1321 |
|
1322 | 1322 | \pnum
|
1323 | 1323 | If a
|
1324 | 1324 | \indextext{value computation}%
|
1325 |
| -value computation \term{A} of an atomic object \term{M} happens before a |
1326 |
| -value computation \term{B} of \term{M}, and \term{A} takes its value from a side |
1327 |
| -effect \term{X} on \term{M}, then the value computed by \term{B} shall either be |
1328 |
| -the value stored by \term{X} or the value stored by a |
| 1325 | +value computation \placeholder{A} of an atomic object \placeholder{M} happens before a |
| 1326 | +value computation \placeholder{B} of \placeholder{M}, and \placeholder{A} takes its value from a side |
| 1327 | +effect \placeholder{X} on \placeholder{M}, then the value computed by \placeholder{B} shall either be |
| 1328 | +the value stored by \placeholder{X} or the value stored by a |
1329 | 1329 | \indextext{side effects}%
|
1330 |
| -side effect \term{Y} on |
1331 |
| -\term{M}, where \term{Y} follows \term{X} in the modification order of \term{M}. |
| 1330 | +side effect \placeholder{Y} on |
| 1331 | +\placeholder{M}, where \placeholder{Y} follows \placeholder{X} in the modification order of \placeholder{M}. |
1332 | 1332 | \begin{note} This requirement is known as read-read coherence. \end{note}
|
1333 | 1333 |
|
1334 | 1334 | \pnum
|
1335 | 1335 | If a
|
1336 | 1336 | \indextext{value computation}%
|
1337 |
| -value computation \term{A} of an atomic object \term{M} happens before an |
1338 |
| -operation \term{B} that modifies \term{M}, then \term{A} shall take its value from a side |
1339 |
| -effect \term{X} on \term{M}, where \term{X} precedes \term{B} in the |
1340 |
| -modification order of \term{M}. \begin{note} This requirement is known as |
| 1337 | +value computation \placeholder{A} of an atomic object \placeholder{M} happens before an |
| 1338 | +operation \placeholder{B} that modifies \placeholder{M}, then \placeholder{A} shall take its value from a side |
| 1339 | +effect \placeholder{X} on \placeholder{M}, where \placeholder{X} precedes \placeholder{B} in the |
| 1340 | +modification order of \placeholder{M}. \begin{note} This requirement is known as |
1341 | 1341 | read-write coherence. \end{note}
|
1342 | 1342 |
|
1343 | 1343 | \pnum
|
1344 | 1344 | If a
|
1345 | 1345 | \indextext{side effects}%
|
1346 |
| -side effect \term{X} on an atomic object \term{M} happens before a value |
1347 |
| -computation \term{B} of \term{M}, then the evaluation \term{B} shall take its |
1348 |
| -value from \term{X} or from a |
| 1346 | +side effect \placeholder{X} on an atomic object \placeholder{M} happens before a value |
| 1347 | +computation \placeholder{B} of \placeholder{M}, then the evaluation \placeholder{B} shall take its |
| 1348 | +value from \placeholder{X} or from a |
1349 | 1349 | \indextext{side effects}%
|
1350 |
| -side effect \term{Y} that follows \term{X} in the |
1351 |
| -modification order of \term{M}. \begin{note} This requirement is known as |
| 1350 | +side effect \placeholder{Y} that follows \placeholder{X} in the |
| 1351 | +modification order of \placeholder{M}. \begin{note} This requirement is known as |
1352 | 1352 | write-read coherence. \end{note}
|
1353 | 1353 |
|
1354 | 1354 | \pnum
|
|
1367 | 1367 | as described above, satisfy the resulting constraints as imposed here. \end{note}
|
1368 | 1368 |
|
1369 | 1369 | \pnum
|
1370 |
| -\indextext{potentially~concurrent}% |
1371 |
| -Two actions are \term{potentially concurrent} if |
| 1370 | +Two actions are \defnx{potentially concurrent}{potentially~concurrent} if |
1372 | 1371 | \begin{itemize}
|
1373 | 1372 | \item they are performed by different threads, or
|
1374 | 1373 | \item they are unsequenced, and at least one is performed by a signal handler.
|
|
0 commit comments