回答編集履歴

1

追記

2020/05/14 05:53

投稿

episteme
episteme

スコア16614

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