0

スレッドで非スレッド セーフ ライブラリを使用する。サーバーに接続するライブラリがあるとします。また、スレッドセーフではありません。2 つのスレッド内でライブラリを開始できますか?

すなわち:

thread_1(){
telnet_lib_t *connection1;

while(1){
do_somestuff
}

free_telnet(connection1);
}

thread_2(){
telnet_lib_t *connection2;

while(1){
     do_somestuff;
}

free_telnet(connection2);
}

これは機能しますか?これで、ライブラリの 2 つの独立したインスタンスが実行されました。お互いに干渉しませんよね?

4

4 に答える 4

1

いいえ、これはできません。ライブラリにグローバル状態がなく、その関数が内部的にスレッドセーフでない場合は、ライブラリ全体をミューテックスで保護し、一度に1つのスレッドのみがライブラリにアクセスできるようにすることで問題を解決できます(ただし、これは法外な場合がありますが、特に、ライブラリが低速またはブロッキングタスクを実行する場合)。しかし、ライブラリが基本的に使用する単一のグローバル状態を持ち、状態を保存/復元/交換する方法がない場合、複数のスレッドでそれを使用する方法はありません(または、スレッド化されていないプログラムで複数のコンテキストを交互に使用することさえできません) )。このようなライブラリは一般的にゴミと見なされ、交換する必要があります。

于 2012-04-04T01:31:57.643 に答える
0

スレッドセーフではない理由によって異なります。

たとえば、ライブラリが静的変数を使用している場合でも、それは2つのスレッド間で共有されます。

したがって、一般的にこれは悪い考えです。スレッドセーフでないものがある場合は、スレッドで使用しないでください。ただし、子プロセスをforkしてから使用することもできます。これは、スレッドよりも重いですが、より安全です。

于 2012-04-04T01:31:10.013 に答える
0

非スレッドセーフライブラリの詳細について詳しく知らなければ、あなたが提案するように安全に使用できるとは言えません。

ライブラリにグローバル共有リソース(グローバル変数など)がある場合、2つのスレッドは互いに足を踏み入れ、ライブラリの作成者が意図していない方法でそのグローバル変数を上書きする可能性があります。

問題は、最終的に競合が発生しないことを確実に証明できるテストの量がないことです。

ライブラリを並行して使用する必要がある場合、それを行うために私が考えることができる唯一の安全な方法は、プロセス分離を使用することです...それぞれがライブラリのインスタンスをロードする複数の子プロセスを作成します。

于 2012-04-04T01:31:18.283 に答える
0

telnet_lib_tおよびそのメソッドがどのグローバル状態でも機能しない (つまり、グローバル変数に依存していない)ことがわかっている場合にのみ、これを行うことができます。ライブラリの状態がそれ自体に含まれていることがわかっている場合は それを使用してください。そうでない場合は使用しないでください。テスト中に問題が発生しなくても、どこかに問題が潜んでいないわけではありません。

于 2012-04-04T01:35:30.667 に答える