2

現在、マルチスレッドをサポートするためにシングルスレッドライブラリを移植しています。ローカルの静的変数またはグローバル変数を使用する関数の全リストが必要です。

どんな情報でも大歓迎です。

4

2 に答える 2

2

使用する各機能のマニュアルページを確認してください...スレッドセーフではないものはそのように識別され、マニュアルページにはスレッドセーフバージョンがある場合はそれが記載されています(例:)readdir_r。マニュアルページでスクリプトを実行することにより、リストを抽出できます。

編集:私の答えは受け入れられましたが、それは不正確で恐らく危険であると私は恐れています。たとえば、strerror_rはそれがスレッドセーフバージョンのstrerrorであると述べていますが、strerror自体はスレッドセーフについては何も述べていません...代わりに「文字列が上書きされる可能性があります」ということです。これは単にスレッドセーフではないことを意味します。 。したがって、少なくとも「上書きされる可能性がある」と「スレッド」を検索する必要がありますが、それでも完全であるという保証はありません。

于 2012-09-26T06:50:31.427 に答える
1

特定の関数が再入可能であるかどうかを知ることは常に良い考えですが、複数のスレッドからの共有コードから複数の再入可能関数を呼び出す可能性がある状況も考慮する必要があります。これは、共有データを使用するときに問題を引き起こす可能性もあります。 。

したがって、スレッド間でデータを共有している場合は、呼び出されている関数が再入可能であるという事実に関係なく、データを「保護」する必要があります。

次の関数について考えてみます。

void yourFunc(CommonObject *o)
{
    /* This function is NOT thread safe */
    reentrant_func1(o->propertyA);
    reentrant_func2(o->propertyA);
}

この関数がミューテックスで保護されていない場合、func1とfunc2が再入可能であるという事実に関係なく、マルチスレッドアプリケーションで望ましくない動作が発生します。

于 2012-09-26T07:21:17.463 に答える