「スレッドセーフ」の版間の差分
提供: C言語入門
(ページの作成:「スレッドセーフ (Thread-safe) とは、マルチスレッドプログラミングの概念です。複数のスレッドが同時に、同じコードを実行...」) |
(→スレッドセーフであるかの判断基準) |
||
行16: | 行16: | ||
== スレッドセーフであるかの判断基準 == | == スレッドセーフであるかの判断基準 == | ||
プログラムが[[スレッドセーフ]]であるかを判断するのは、簡単ではありませんが、以下の点に着目して、コードを読む・調べることで、判断することができます。 | プログラムが[[スレッドセーフ]]であるかを判断するのは、簡単ではありませんが、以下の点に着目して、コードを読む・調べることで、判断することができます。 | ||
− | * グローバル変数(広域変数)やヒープ(動的メモリ)にアクセスしていない | + | * グローバル変数(広域変数)やヒープ(動的メモリ)、静的変数(スタティック変数,static変数)にアクセスしていない |
* ファイルやプロセスなどのリソースの確保や開放を実施していない | * ファイルやプロセスなどのリソースの確保や開放を実施していない | ||
* 参照やポインタによる間接的なアクセスをしていない | * 参照やポインタによる間接的なアクセスをしていない | ||
* volatile 変数を利用していない | * volatile 変数を利用していない | ||
+ | * [[スレッドセーフ]]でない関数を呼び出していない | ||
+ | |||
== スレッドセーフの要件 == | == スレッドセーフの要件 == | ||
[[スレッドセーフ]]を実現する方法として、以下の要件があります。 | [[スレッドセーフ]]を実現する方法として、以下の要件があります。 |
2016年4月16日 (土) 12:40時点における版
スレッドセーフ (Thread-safe) とは、マルチスレッドプログラミングの概念です。複数のスレッドが同時に、同じコードを実行しても問題が発生しない、ということを意味します。
読み方
- スレッドセーフ
- すれっどせーふ
- Thread-safe
- すれっどせーふ
概要
マルチスレッドプログラミングでは、複数のスレッドが並列で実行されるため、リソースへのアクセスに注意が必要になります。 forkモデルのマルチプロセスでは、メモリ空間がプロセスごとに分離されますが、マルチスレッドプログラミングの場合は、同じメモリ空間で実行されるため、広域メモリへのアクセスを行うときに、mutex ロックを利用するなど、排他制御などが必要となります。
格スレッドから考えなしにリソースにアクセスするとき、プログラムは予期せぬ事態に陥り、期待した動作ができず、おかしな結果になったり、プログラムが停止してしまう、といったことにつながります。
マルチスレッドプログラミング では、プログラムが安全に実行できるように、 スレッドセーフ に対応したライブラリを利用することや、スレッドセーフ のコードを書く必要があります。
スレッドセーフであるかの判断基準
プログラムがスレッドセーフであるかを判断するのは、簡単ではありませんが、以下の点に着目して、コードを読む・調べることで、判断することができます。
- グローバル変数(広域変数)やヒープ(動的メモリ)、静的変数(スタティック変数,static変数)にアクセスしていない
- ファイルやプロセスなどのリソースの確保や開放を実施していない
- 参照やポインタによる間接的なアクセスをしていない
- volatile 変数を利用していない
- スレッドセーフでない関数を呼び出していない
スレッドセーフの要件
スレッドセーフを実現する方法として、以下の要件があります。
- リエントラント
- 排他制御
- スレッドローカルデータ
- アトミック操作
排他制御
pthread を利用する場合の排他制御には、pthread_mutex を利用できます。 詳しくは、pthread_mutexで排他ロックする方法 をご参照下さい。
アトミック操作
C言語でアトミックな操作をする場合は、C11で導入した アトミック型修飾子 が利用できます。