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

回答編集履歴

1

補足

2018/02/15 12:54

投稿

Chironian
Chironian

スコア23274

answer CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  静的領域(グローバル変数やstaticローカル変数)は、きっちり意識しないと複数のスレッドから簡単にアクセスできるのでハマります。(staticローカル変数はそれを定義している関数を複数のスレッドが同時に呼び出すと同時アクセスが発生する可能性があります。)
10
10
 
11
- ヒープ領域を複数のスレッドで同時アクセスする場合、多少は起きにくいですが、複数のスレッドでポインタ経由で同じヒープ上のオブジェクトを共有することも油断すると発生しますので、やはり危険です。(C++ではないですが、C#のGUIオブジェクトが該当します。)
11
+ ヒープ領域を複数のスレッドで同時アクセスする場合、多少は起きにくいですが、複数のスレッドでポインタ経由で同じヒープ上のオブジェクトを共有することも油断すると発生しますので、やはり危険です。(例えば、C++ではないですが、C#のGUIオブジェクトが該当します。)
12
12
 
13
13
  スタック領域のオブジェクトへのポインタを複数のスレッドで共有することはレアと思いますが、原理的には有りえます。
14
14
 
@@ -20,4 +20,7 @@
20
20
 
21
21
  > rand()、srand()のようなグローバル変数で実装されている関数は単純に排他的制御(ロック機能)をプログラマ側で用意すればマルチスレッドでも安全に利用可能ですよね??
22
22
 
23
- 基本的にはその通りです。しかし、ロック機構は[デッドロック](https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%83%E3%83%89%E3%83%AD%E3%83%83%E3%82%AF)のリスクがありますので、必ずしも安全になるわけではありません。ロックする時はデッドロックしないことに要注意です。経験的にはスレッドを終了させる際に発生しやすいです。(呼び出し側がスレッド終了を待ち、スレッドは呼び出し側スレッドの応答を待っているなど。)
23
+ 基本的にはその通りです。しかし、ロック機構は[デッドロック](https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%83%E3%83%89%E3%83%AD%E3%83%83%E3%82%AF)のリスクがありますので、必ずしも安全になるわけではありません。ロックする時はデッドロックしないことに要注意です。経験的にはスレッドを終了させる際に発生しやすいです。(呼び出し側がスレッド終了を待ち、スレッドは呼び出し側スレッドの応答を待っているなど。)
24
+
25
+ とはいえ、同じメモリへの書き込みと読み出しがあるなら、通常は比較的安易にMutexでロックしてます。
26
+ そして、複数のロックを待つ処理がないことをチェックしています。