@@ -10760,7 +10760,7 @@ the same memory. Concurrent programming is tricky for many reasons, most
10760
10760
importantly that it is undefined behavior to read data in one thread after it
10761
10761
was written by another thread, if there is no proper synchronization between
10762
10762
those threads. Making existing single-threaded code execute concurrently can be
10763
- as trivial as adding `std::async` or `std::thread` strategically, or it can be
10763
+ as trivial as adding `std::async` or `std::thread` strategically, or it can
10764
10764
necessitate a full rewrite, depending on whether the original code was written
10765
10765
in a thread-friendly way.
10766
10766
@@ -10939,7 +10939,7 @@ Help the tools:
10939
10939
##### Reason
10940
10940
10941
10941
If you don't share writable data, you can't have a data race.
10942
- The less sharing you do, the less chance you have to forget to synchanize access (and get data races).
10942
+ The less sharing you do, the less chance you have to forget to synchronize access (and get data races).
10943
10943
The less sharing you do, the less chance you have to wait on a lock (so performance can improve).
10944
10944
10945
10945
##### Example
@@ -10965,7 +10965,7 @@ The less sharing you do, the less chance you have to wait on a lock (so performa
10965
10965
// ...
10966
10966
}
10967
10967
10968
- Without those `const`s, we would have to review every asynchroneously invoked function for potential data races on `surface_readings`.
10968
+ Without those `const`s, we would have to review every asynchronously invoked function for potential data races on `surface_readings`.
10969
10969
10970
10970
##### Note
10971
10971
@@ -10981,7 +10981,7 @@ No locking is needed: You can't have a data race on a constant.
10981
10981
10982
10982
##### Reason
10983
10983
10984
- A `thread` is a implementation concept, a way of thinking about the machine.
10984
+ A `thread` is an implementation concept, a way of thinking about the machine.
10985
10985
A task is an application notion, something you'd like to do, preferably concurrently with other tasks.
10986
10986
Application concepts are easier to reason about.
10987
10987
@@ -11072,7 +11072,7 @@ Concurrency rule summary:
11072
11072
* [CP.27: Use plain `std::thread` for `thread`s that detach based on a run-time condition (only)](#Rconc-thread)
11073
11073
* [CP.28: Remember to join scoped `thread`s that are not `detach()`ed](#Rconc-join)
11074
11074
* [CP.30: Do not pass pointers to local variables to non-`raii_thread's](#Rconc-pass)
11075
- * [CP.31: Pass small amounts of data between threads by value, reather by reference or pointer](#Rconc-data)
11075
+ * [CP.31: Pass small amounts of data between threads by value, rather than by reference or pointer](#Rconc-data)
11076
11076
* [CP.32: To share ownership beween unrelated `thread`s use `shared_ptr`](#Rconc-shared)
11077
11077
* [CP.40: Minimize context switching](#Rconc-switch)
11078
11078
* [CP.41: Minimize thread creation and destruction](#Rconc-create)
@@ -11215,7 +11215,7 @@ If, as it is likely, `f()` invokes operations on `*this`, we must make sure that
11215
11215
11216
11216
##### Reason
11217
11217
11218
- To maintain pointer safety and avoid leaks, we need to consider what pointers a used by a `thread`.
11218
+ To maintain pointer safety and avoid leaks, we need to consider what pointers are used by a `thread`.
11219
11219
If a `thread` joins, we can safely pass pointers to objects in the scope of the `thread` and its enclosing scopes.
11220
11220
11221
11221
##### Example
@@ -11254,7 +11254,7 @@ After that, the usual lifetime and ownership (for local objects) enforcement app
11254
11254
11255
11255
##### Reason
11256
11256
11257
- To maintain pointer safety and avoid leaks, we need to consider what pointers a used by a `thread`.
11257
+ To maintain pointer safety and avoid leaks, we need to consider what pointers are used by a `thread`.
11258
11258
If a `thread` is detached, we can safely pass pointers to static and free store objects (only).
11259
11259
11260
11260
##### Example
@@ -11414,7 +11414,7 @@ A `thread` that has not been `detach()`ed when it is destroyed terminates the pr
11414
11414
11415
11415
##### Reason
11416
11416
11417
- In general, you cannot know whether a non-`raii_thread` will outlife your thread ( so that those pointers will become invalid.
11417
+ In general, you cannot know whether a non-`raii_thread` will outlive the scope of the variables, so that those pointers will become invalid.
11418
11418
11419
11419
##### Example, bad
11420
11420
@@ -11426,7 +11426,7 @@ In general, you cannot know whether a non-`raii_thread` will outlife your thread
11426
11426
t0.detach();
11427
11427
}
11428
11428
11429
- The detach` may not be so easy to spot.
11429
+ The ` detach` may not be so easy to spot.
11430
11430
Use a `raii_thread` or don't pass the pointer.
11431
11431
11432
11432
##### Example, bad
@@ -11435,10 +11435,10 @@ Use a `raii_thread` or don't pass the pointer.
11435
11435
11436
11436
##### Enforcement
11437
11437
11438
- Flage pointers to locals passed in the constructor of a plain `thread`.
11438
+ Flag pointers to locals passed in the constructor of a plain `thread`.
11439
11439
11440
11440
11441
- ### <a name="Rconc-switch"></a>CP.31: Pass small amounts of data between threads by value, reather by reference or pointer
11441
+ ### <a name="Rconc-switch"></a>CP.31: Pass small amounts of data between threads by value, rather by reference or pointer
11442
11442
11443
11443
##### Reason
11444
11444
@@ -11447,7 +11447,7 @@ Copying naturally gives unique ownership (simplifies code) and eliminates the po
11447
11447
11448
11448
##### Note
11449
11449
11450
- Defining "small amount" precisely and is impossible.
11450
+ Defining "small amount" precisely is impossible.
11451
11451
11452
11452
##### Example
11453
11453
@@ -11462,7 +11462,7 @@ Defining "small amount" precisely and is impossible.
11462
11462
11463
11463
The call of `modify1` involves copying two `string` values; the call of `modify2` does not.
11464
11464
On the other hand, the implementation of `modify1` is exactly as we would have written in for single-threaded code,
11465
- wheread the implementation of `modify2` will need some form of locking to avoid data races.
11465
+ whereas the implementation of `modify2` will need some form of locking to avoid data races.
11466
11466
If the string is short (say 10 characters), the call of `modify1` can be surprisingly fast;
11467
11467
essentially all the cost is in the `thread` switch. If the string is long (say 1,000,000 characters), copying it twice
11468
11468
is probably not a good idea.
@@ -11479,7 +11479,7 @@ message passing or shared memory.
11479
11479
11480
11480
##### Reason
11481
11481
11482
- If treads are unrelated (that is, not known to be in the same scope or one within the lifetime of the other)
11482
+ If threads are unrelated (that is, not known to be in the same scope or one within the lifetime of the other)
11483
11483
and they need to share free store memory that needs to be deleted, a `shared_ptr` (or equivalent) is the only
11484
11484
safe way to ensure proper deletion.
11485
11485
@@ -11489,7 +11489,7 @@ safe way to ensure proper deletion.
11489
11489
11490
11490
##### Note
11491
11491
11492
- * 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.
11492
+ * 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.
11493
11493
* An object on free store that is never to be deleted can be shared.
11494
11494
* An object owned by one thread can be safely shared with another as long as that second thread doesn't outlive the owner.
11495
11495
@@ -11502,7 +11502,7 @@ safe way to ensure proper deletion.
11502
11502
11503
11503
##### Reason
11504
11504
11505
- Context swtiches are expesive .
11505
+ Context swtiches are expensive .
11506
11506
11507
11507
##### Example
11508
11508
@@ -11561,7 +11561,7 @@ Instead, we could have a set of pre-created worker threads processing the messag
11561
11561
11562
11562
##### Note
11563
11563
11564
- If you system has a good thread pool, use it.
11564
+ If your system has a good thread pool, use it.
11565
11565
If your system has a good message queue, use it.
11566
11566
11567
11567
##### Enforcement
@@ -11636,7 +11636,7 @@ it will immediately go back to sleep, waiting.
11636
11636
11637
11637
##### Enforcement
11638
11638
11639
- Flag all `waits` without conditions.
11639
+ Flag all `wait`s without conditions.
11640
11640
11641
11641
11642
11642
### <a name="Rconc-time"></a>CP.43: Minimize time spent in a critical section
0 commit comments