teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2020/05/14 05:53

投稿

episteme
episteme

スコア16612

answer CHANGED
@@ -1,1 +1,19 @@
1
- 明示的に排他しないかぎりno-guardです。
1
+ 明示的に排他しないかぎりno-guardです。
2
+
3
+ [追記] 説明足りんかったかな。
4
+ ```
5
+ void f() {
6
+ なんかする
7
+ }
8
+
9
+ void g() {
10
+ ここでガード
11
+ f();
12
+ }
13
+ ```
14
+ g()が呼ばれたらf()内の"なんかする"の間はガードされています。
15
+ が、f()が直接呼ばれたらガードされてません。
16
+ なので、利用者は絶対にf()を直接呼ばないならこれでいいけど、
17
+ 利用者にf()を公開するならf()でもガードせにゃなりません。
18
+ ところがf()でガードするとg()から呼ばれたときに多重ロックが発生します。
19
+ それを回避するには [recursive_mutex](https://cpprefjp.github.io/reference/mutex/recursive_mutex.html) を使うことになろうかと。