2

私は現在 C で書いているアプリを持っています。ここでは、プロジェクトの一部であるライブラリ内で宣言されたいくつかの TLS 静的グローバル変数があります。

TLS 変数は、gcc の __thread ディレクティブを使用して宣言されます。

.ctor && .dtor セクションを使用して、共有または静的 C ライブラリ内のスレッドごとに TLS データを初期化できるかどうか、およびこの方法を使用したスレッドセーフがどの程度かを知りたいです。

.ctor && .dtor セクションはスレッドごとに実行されますか、それとも親プロセスにのみ存在しますか?

最後に、ライブラリはアプリケーション コードに静的または動的にコンパイルされます。これは、共有/静的ライブラリで宣言された .ctor && .dotr セクションが最終的な実行可能ファイルの一部になることを意味しますか?

ほとんどのスレッド部分について本当に混乱しています...アイデアを持っている人はいますか?

4

3 に答える 3

1

pthread_key_create は、デストラクタ コールバックで tls エントリを作成します。

使用例はこちら: http://linux.die.net/man/3/pthread_key_create

ただし、スレッドで tls 変数を設定する必要があります。そうしないと、デストラクタ コールバックが呼び出されません。

于 2013-12-05T03:49:12.833 に答える
1

試してみて何が起こるか見てみましょう。ただし、マニュアルで定義されていない動作に依存しないことをお勧めします。これは予告なしに変更される可能性があります。

私の知る限り、ロード時__attribute__((constructor))に実行されるグローバル データにのみ適用されます。それを TLS と混合しようとすると、未定義になるか、マスター スレッドのデータのみを初期化する可能性があります。

于 2013-01-14T10:07:33.360 に答える
0

いいえ、スレッドの起動時にアクティブ化できるコールバックはありません。これはパフォーマンス キラーになると思います。ナイーブなプログラマーが偶然そのようなコールバックを追加する可能性があり、その TLS にアクセスしないスレッドであっても、突然プログラムのすべてのスレッドが遅くなる可能性があります。

gcc__threadおよび対応する C11 機能について_Thread_localは、静的な初期化のみが予見されます。これは、コンパイル時に決定する必要があるすべてのコピーで同じ値が使用されます。

于 2013-01-14T10:27:20.747 に答える