2

私はプログラムを持っていますが、これはlinuxthreadsとnptlでは動作が異なる必要があります。

このライブラリには、私のプログラムで検出に使用できる定義がありますか、nptlが使用されていますか、それともlinuxthreadsが使用されていますか?

UPDATE1:ランタイムにはgetconf GLIBC_LIBPTHREADSがありますが、コンパイル時はどうなりますか?

4

3 に答える 3

4

これは可能ではないようです。ロード時に実装を変更できるため、何をしてもコンパイル時に知る方法はありません。

pthreads の man ページから:

LinuxThreads と NPTL の両方をサポートする glibc (つまり、glibc 2.3.x) を備えたシステムでは、LD_ASSUME_KERNEL 環境変数を使用して、動的リンカーのデフォルトのスレッド実装の選択をオーバーライドできます。この変数は、ダイナミック リンカーが特定のカーネル バージョンで実行されていると想定するように指示します。NPTL が必要とするサポートを提供しないカーネル バージョンを指定することで、LinuxThreads の使用を強制できます。(これを行う最も可能性の高い理由は、LinuxThreads の非準拠の動作に依存する (壊れた) アプリケーションを実行することです。) 例:

bash$ $( LD_ASSUME_KERNEL=2.2.5 ldd /bin/ls | grep libc.so | \
                awk '{print $3}' ) | egrep -i 'threads|ntpl'
linuxthreads-0.10 by Xavier Leroy

2 つの実装は (ほとんど) バイナリ互換であることは言うまでもありません。そのため、基本的にコンパイル時にどちらのスレッド ライブラリが使用されるかを知ることはできません。バイナリを NPTL システムから LinuxThreads システムにコピーします。少なくとも信頼できる方法では、コンパイル時に既知のものではないため、それを行うことはできません。

ランタイム検出を使用する何らかの方法を見つける必要があります。または、これを実行する理由に関する情報で投稿を更新し、他の方法でそれを達成する方法や作成方法について誰かがアドバイスを提供することもできます。どの pthreads が使用されているかのランタイム検出を使用することが可能です。

もう 1 つの考えられる解決策は、configure スクリプトにオプションを追加し、それをコンパイルする人に選択させることです。

于 2010-11-11T20:41:36.283 に答える
1

一歩下がって聞いてみましょう - なぜこれをしたいのですか?

ある機能が提供していて、別の機能が提供していない機能はありますか? もしそうなら、実行時にそれらの存在を動的に照会するためdlsymに onを使用できます。libpthread.so

それとも、それらの間で異なる動作の問題であり、プログラムの誤動作を引き起こしていますか? もしそうなら、私はそのような行動の結果に依存することを避けるか、POSIX のような標準を参照して、何を信頼できるかを判断します。多くの場合、このような移植性のバグは、 「機能している」と思われるライブラリを使用していても対処する必要があるコードの実際の欠陥を表しています。並行性が問題になると、これを正しく行うことが特に重要になります。

最後に、それが構造体のサイズの問題である場合は...これにもハックな方法があるかもしれません。例(単なる例であり、完全にベースから外れている可能性がありますが、アイデアを示しています):

// Hack around difference in pthread_mutex_t
//
#define pthread_mutex_t pthread_mutex_t_linuxthreads
#include <some_linuxthreads_header.h>
#undef pthread_mutex_t
#define pthread_mutex_t pthread_mutex_t_ntpl
#include <some_ntpl_header.h>
#undef pthread_mutex_t

typedef union {
    pthread_mutex_t_linxthreads linuxthreads;
    pthread_mutex_t_ntpl ntpl;
} pthread_mutex_t;

非常にハックで非常に醜いですが、可能な回避策としてこれらの種類のアイデアを投げかけているだけです...

于 2010-11-11T20:45:09.663 に答える
1

ヘッダーを調べた後、いいえ-NPTLとLinuxThreadsの特定の定義はありません。

このような定義が必要な場合は、ヘッダー ファイルを生成する小さなスクリプトを作成するか、define フラグをコンパイラに渡します。/lib/libc.so.6 の出力を解析することで情報を取得できます (そのライブラリは、通常の実行可能ファイルとして直接実行できます)。詳細はお任せしますが、出力は次のようになります。

Linux スレッド:

Roland McGrath らによる GNU C ライブラリの安定版リリース バージョン 2.3.4。
Copyright (C) 2005 Free Software Foundation, Inc.
これはフリー ソフトウェアです。条件のコピーについてはソースを参照してください。
保証はありません。商品性や適合性のためでさえありません
特定の目的。
GNU CC バージョン 3.4.6 20060404 (Red Hat 3.4.6-11) でコンパイル。
2010 年 4 月 18 日に Linux 2.4.20 システムでコンパイルされました。
利用可能な拡張子:
        Per BothnerによるGNU libio
        Michael Glad ほかによる crypt アドオン バージョン 2.1
        Xavier Leroyによるlinuxthreads-0.10
        C スタブ アドオン バージョン 2.1.2。
        BIND-8.2.3-T5B
        NIS(YP)/NIS+ NSS モジュール 0.19 Thorsten Kukuk 作
        Christian Gafton による glibc-2.0 互換性アドオン
        GNU Libidn by Simon Josefsson
        Alpha Processor Inc が後援する libthread_db の作業
スレッド ローカル ストレージのサポートが含まれています。
バグ報告の手順については、次を参照してください。
.

NPTL:

Roland McGrath らによる GNU C ライブラリの安定版リリース バージョン 2.5。
Copyright (C) 2006 Free Software Foundation, Inc.
これはフリー ソフトウェアです。条件のコピーについてはソースを参照してください。
保証はありません。商品性や適合性のためでさえありません
特定の目的。
GNU CC バージョン 4.1.2 20080704 (Red Hat 4.1.2-48) でコンパイル。
2010 年 10 月 25 日に Linux 2.6.9 システムでコンパイルされました。
利用可能な拡張子:
        C スタブ アドオン バージョン 2.1.2。
        Michael Glad ほかによる crypt アドオン バージョン 2.1
        GNU Libidn by Simon Josefsson
        Per BothnerによるGNU libio
        NIS(YP)/NIS+ NSS モジュール 0.19 Thorsten Kukuk 作
        Ulrich Drepper 他によるネイティブ POSIX スレッド ライブラリ
        BIND-8.2.3-T5B
        Linux カーネル aio を使用した RT
スレッド ローカル ストレージのサポートが含まれています。
バグ報告の手順については、次を参照してください。
.

(ただし、これに対処する必要のないコードを書くようにしてください。これまでのところ、RHEL 4 (linuxthreads) と RHEL 5 (NPTL) で実行されるマルチスレッド アプリでは、これが必要になることはありません)

于 2010-11-11T21:26:30.330 に答える