@@ -10761,7 +10761,7 @@ the same memory. Concurrent programming is tricky for many reasons, most
1076110761importantly that it is undefined behavior to read data in one thread after it
1076210762was written by another thread, if there is no proper synchronization between
1076310763those threads. Making existing single-threaded code execute concurrently can be
10764- as trivial as adding `std::async` or `std::thread` strategically, or it can be
10764+ as trivial as adding `std::async` or `std::thread` strategically, or it can
1076510765necessitate a full rewrite, depending on whether the original code was written
1076610766in a thread-friendly way.
1076710767
@@ -10940,7 +10940,7 @@ Help the tools:
1094010940##### Reason
1094110941
1094210942If you don't share writable data, you can't have a data race.
10943- The less sharing you do, the less chance you have to forget to synchanize access (and get data races).
10943+ The less sharing you do, the less chance you have to forget to synchronize access (and get data races).
1094410944The less sharing you do, the less chance you have to wait on a lock (so performance can improve).
1094510945
1094610946##### Example
@@ -10966,7 +10966,7 @@ The less sharing you do, the less chance you have to wait on a lock (so performa
1096610966 // ...
1096710967 }
1096810968
10969- Without those `const`s, we would have to review every asynchroneously invoked function for potential data races on `surface_readings`.
10969+ Without those `const`s, we would have to review every asynchronously invoked function for potential data races on `surface_readings`.
1097010970
1097110971##### Note
1097210972
@@ -10982,7 +10982,7 @@ No locking is needed: You can't have a data race on a constant.
1098210982
1098310983##### Reason
1098410984
10985- A `thread` is a implementation concept, a way of thinking about the machine.
10985+ A `thread` is an implementation concept, a way of thinking about the machine.
1098610986A task is an application notion, something you'd like to do, preferably concurrently with other tasks.
1098710987Application concepts are easier to reason about.
1098810988
@@ -11073,7 +11073,7 @@ Concurrency rule summary:
1107311073* [CP.27: Use plain `std::thread` for `thread`s that detach based on a run-time condition (only)](#Rconc-thread)
1107411074* [CP.28: Remember to join scoped `thread`s that are not `detach()`ed](#Rconc-join)
1107511075* [CP.30: Do not pass pointers to local variables to non-`raii_thread's](#Rconc-pass)
11076- * [CP.31: Pass small amounts of data between threads by value, reather by reference or pointer](#Rconc-data)
11076+ * [CP.31: Pass small amounts of data between threads by value, rather than by reference or pointer](#Rconc-data)
1107711077* [CP.32: To share ownership beween unrelated `thread`s use `shared_ptr`](#Rconc-shared)
1107811078* [CP.40: Minimize context switching](#Rconc-switch)
1107911079* [CP.41: Minimize thread creation and destruction](#Rconc-create)
@@ -11216,7 +11216,7 @@ If, as it is likely, `f()` invokes operations on `*this`, we must make sure that
1121611216
1121711217##### Reason
1121811218
11219- To maintain pointer safety and avoid leaks, we need to consider what pointers a used by a `thread`.
11219+ To maintain pointer safety and avoid leaks, we need to consider what pointers are used by a `thread`.
1122011220If a `thread` joins, we can safely pass pointers to objects in the scope of the `thread` and its enclosing scopes.
1122111221
1122211222##### Example
@@ -11255,7 +11255,7 @@ After that, the usual lifetime and ownership (for local objects) enforcement app
1125511255
1125611256##### Reason
1125711257
11258- To maintain pointer safety and avoid leaks, we need to consider what pointers a used by a `thread`.
11258+ To maintain pointer safety and avoid leaks, we need to consider what pointers are used by a `thread`.
1125911259If a `thread` is detached, we can safely pass pointers to static and free store objects (only).
1126011260
1126111261##### Example
@@ -11415,7 +11415,7 @@ A `thread` that has not been `detach()`ed when it is destroyed terminates the pr
1141511415
1141611416##### Reason
1141711417
11418- In general, you cannot know whether a non-`raii_thread` will outlife your thread ( so that those pointers will become invalid.
11418+ In general, you cannot know whether a non-`raii_thread` will outlive the scope of the variables, so that those pointers will become invalid.
1141911419
1142011420##### Example, bad
1142111421
@@ -11427,7 +11427,7 @@ In general, you cannot know whether a non-`raii_thread` will outlife your thread
1142711427 t0.detach();
1142811428 }
1142911429
11430- The detach` may not be so easy to spot.
11430+ The ` detach` may not be so easy to spot.
1143111431Use a `raii_thread` or don't pass the pointer.
1143211432
1143311433##### Example, bad
@@ -11436,10 +11436,10 @@ Use a `raii_thread` or don't pass the pointer.
1143611436
1143711437##### Enforcement
1143811438
11439- Flage pointers to locals passed in the constructor of a plain `thread`.
11439+ Flag pointers to locals passed in the constructor of a plain `thread`.
1144011440
1144111441
11442- ### <a name="Rconc-switch"></a>CP.31: Pass small amounts of data between threads by value, reather by reference or pointer
11442+ ### <a name="Rconc-switch"></a>CP.31: Pass small amounts of data between threads by value, rather by reference or pointer
1144311443
1144411444##### Reason
1144511445
@@ -11448,7 +11448,7 @@ Copying naturally gives unique ownership (simplifies code) and eliminates the po
1144811448
1144911449##### Note
1145011450
11451- Defining "small amount" precisely and is impossible.
11451+ Defining "small amount" precisely is impossible.
1145211452
1145311453##### Example
1145411454
@@ -11463,7 +11463,7 @@ Defining "small amount" precisely and is impossible.
1146311463
1146411464The call of `modify1` involves copying two `string` values; the call of `modify2` does not.
1146511465On the other hand, the implementation of `modify1` is exactly as we would have written in for single-threaded code,
11466- wheread the implementation of `modify2` will need some form of locking to avoid data races.
11466+ whereas the implementation of `modify2` will need some form of locking to avoid data races.
1146711467If the string is short (say 10 characters), the call of `modify1` can be surprisingly fast;
1146811468essentially all the cost is in the `thread` switch. If the string is long (say 1,000,000 characters), copying it twice
1146911469is probably not a good idea.
@@ -11480,7 +11480,7 @@ message passing or shared memory.
1148011480
1148111481##### Reason
1148211482
11483- If treads are unrelated (that is, not known to be in the same scope or one within the lifetime of the other)
11483+ If threads are unrelated (that is, not known to be in the same scope or one within the lifetime of the other)
1148411484and they need to share free store memory that needs to be deleted, a `shared_ptr` (or equivalent) is the only
1148511485safe way to ensure proper deletion.
1148611486
@@ -11490,7 +11490,7 @@ safe way to ensure proper deletion.
1149011490
1149111491##### Note
1149211492
11493- * A static object (e.g. a global) can be shard because it is not owned in the sense that some thread is responsible for it's deletion.
11493+ * A static object (e.g. a global) can be shared because it is not owned in the sense that some thread is responsible for it's deletion.
1149411494* An object on free store that is never to be deleted can be shared.
1149511495* An object owned by one thread can be safely shared with another as long as that second thread doesn't outlive the owner.
1149611496
@@ -11503,7 +11503,7 @@ safe way to ensure proper deletion.
1150311503
1150411504##### Reason
1150511505
11506- Context swtiches are expesive .
11506+ Context swtiches are expensive .
1150711507
1150811508##### Example
1150911509
@@ -11562,7 +11562,7 @@ Instead, we could have a set of pre-created worker threads processing the messag
1156211562
1156311563##### Note
1156411564
11565- If you system has a good thread pool, use it.
11565+ If your system has a good thread pool, use it.
1156611566If your system has a good message queue, use it.
1156711567
1156811568##### Enforcement
@@ -11637,7 +11637,7 @@ it will immediately go back to sleep, waiting.
1163711637
1163811638##### Enforcement
1163911639
11640- Flag all `waits` without conditions.
11640+ Flag all `wait`s without conditions.
1164111641
1164211642
1164311643### <a name="Rconc-time"></a>CP.43: Minimize time spent in a critical section
0 commit comments