http://dev.gentoo.org/~dberkholz/articles/toolchain/tls.pdf を読みました。 TLS の実装はざっくり言うと常に TLS 管理領域を指してるレジスタを一個作ってて、それをスレッドごとに別の値にするだけ。 86 ではセグメントレジスタが使われてる…くらいのざっとした理解はまぁ一般的にあると思うんですが、細かい実装となるとなかなか難しい。間違ってるとこあるかもですがなんか書いてみます。 TLS はまず、本当に全スレッドが使うの? って話があるので、メモリ効率を考えると遅延ロードをした方がいい。ただ遅延ロードするとなるとどうしても関数呼び出しとかがからんで、最初に確保しておいた時のコードよりどうやっても遅くなる。 PLT みたいに関数の呼び出しがどっちにせよ起きるようなケースとは違って、 CPU とメモリのトレードオフがある。 基本的には
スレッドはグローバルは変数は共有しますが、マルチスレッドアプリケーションにおいて、スレッド固有のデータを保持したい場合があります。それを実現するのが、スレッドローカルストレージ(TLS)です。 func()を2つのスレッドとして作成します。そこでは、__thread int aとint bをインクリメントした値を表示しています。最初のスレッドではa = 1 b=1、次のスレッドではa = 1 b=2となっています。int aとしたならa=2なるところです。すなわち__thread int aはスレッド固有の変数というわけです。 #include <stdio.h> #include <pthread.h> __thread int a = 0; int b = 0; void *func(void *arg) { a++; b++; printf("a = %d b=%d\n", a, b
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く