スレッド局所記憶スレッド局所記憶(英: thread local storage, TLS)は、静的もしくは大域的なメモリをスレッドごとに局所的に使用するためのコンピュータプログラミングの方法である。 プロセス内のスレッドはすべてアドレス空間を共有しており、同じプロセスのスレッドから参照する際、静的変数やグローバル変数は同じメモリ番地に配置される。 一方スタック上の変数はすべてのスレッドが自分のスタックを持つためスレッドに対して局所的であり、異なるメモリ番地に存在する。 同じ静的変数・グローバル変数を参照する二つのスレッドが(変数をスレッドに対して局所的にすることで)実際には異なるメモリ番地を参照できることが望ましい場合がある。たとえば典型的な例としてC言語のエラーコードを格納する変数 少なくともメモリアドレスを格納できるサイズの変数をスレッドに対して局所的にすることが可能なら、メモリブロックを確保し、そのメモリアドレスをスレッドローカルな変数に格納すれば、原理的には任意のサイズのメモリブロックをスレッド局所にすることが可能である。 プラットフォーム固有実装マルチスレッドをサポートするプラットフォームや規格には、通例TLSを利用するためのAPIが用意されている。 Windowsでの実装Microsoft Windowsでは、Windows APIの関数 次に
Pthreadsでの実装POSIXスレッド (Pthreads) ではスレッド固有データ (英: thread-specific data) と呼ばれる。このスレッド固有データは、WindowsにおけるTLSの関数や機能と同様である。 プログラミング言語固有の実装プログラマが適切な API 関数を呼ぶのではなく、プログラミング言語自体が TLS をサポートするよう拡張することもできる。 C言語では C11 からキーワード C++ では C++11 においてスレッドに関する規定とキーワード
thread_local int number;
また非定数初期化子の使用やコンストラクタ・デストラクタを呼び出すクラスも使用できる。 thread_local int number = some_non_constexpr_function();
thread_local std::vector<int> number;
C11/C++11 より前から以下の処理系では独自に TLS を実装している。
Windows Vista および Windows Server 2008 より前の Windows では、 C# および .NET 言語静的フィールドは、ThreadStaticAttributeでマークすることができる: class FooBar
{
[ThreadStatic] static int foo;
}
また、Thread.GetNamedDataSlot(String)メソッドによって動的にスレッド局所変数を割り当てることもできる。 JavaJava ではスレッドローカルの変数は、クラス ThreadLocal<Integer> local = new ThreadLocal<Integer>() {
@Override protected Integer initialValue() {
return 1;
}
};
はじめのコードで local.set(local.get() + 1);
PascalObject Pascal (Delphi) や Free Pascal では、 var
myData: Integer;
threadvar
myThreadLocalData: Integer;
PerlPerl のスレッドは言語の進化に伴って CPAN で大半のコードが利用可能になった後で追加された。 その結果、Perl では既存の非スレッドサポートのコードがスレッドのサポートにより影響を受けにくいようすべての変数をスレッドローカルとして扱うことになった。逆に Perl では、スレッドで共有される変数は attribute を用いて作成することができる。 use threads;
use threads::shared;
my $localvar;
my $sharedvar :shared;
PythonPython バージョン 2.4 以降では、threading モジュールの local クラスを使ってスレッド局所記憶を作成することができる。 import threading
mydata = threading.local()
mydata.x = 1
RubyRuby では、スレッド局所変数は []= および [] メソッドを使ってアクセスすることができる。 Thread.current[:user_id] = 1
D言語D言語 の D2 では、グローバル変数および静的変数がデフォルトでスレッド局所変数になった。 この場合、スレッド間で共有される変数は shared修飾子もしくは __gshared属性 を用いて作成することができる。 module sample;
int globalVar; // グローバル変数 (スレッド局所記憶)
shared(int) globalSharedVar; // (スレッド間共有)
外部リンク |
Portal di Ensiklopedia Dunia