1

私はマルチスレッド化されたアプリケーションを持っています.1つのスレッドがwait()で死んだ子を収集する責任があり、別のスレッドが要求に応じてフォークでそれらを生成します.

2.4 カーネルと LinuxThread を使用する 1 つのプラットフォームでは、待機が常に ECHILD で失敗することがわかりました。2.4 カーネルでの LinuxThreads の非 POSIX 準拠の実装に問題がある可能性があることがわかりました。以下の説明では、これを解決する方法がないことを示唆しています。

それでも、誰も解決策を知らないことを確認したいと思います。カーネルのパッチでも構いません。

アプリケーションの設計について考えると、fork() と wait() の両方を 1 つのスレッドで (または膨大な労力をかけてのみ) 実行できるとは思えません。

4

2 に答える 2

1

この (明らかに偽の) 動作は、LinuxThreads 実装の機能のように思えます。

実際には2つの方法しかないようです-NPTLに切り替える(カーネル2.6が必要)か、そのようなマルチスレッドのフォーク/待機モデルを回避します(これが問題に対する私の解決策であり、アーキテクチャが少し複雑で複雑になりましたそれでも 1 日でなんとかできました)

次の例は、LinuxThreads で失敗する偽の状況の基本的な例です。

#include <pthread.h>
#include <sys/wait.h>
#include <unistd.h>
#include <errno.h>

void * wait_for_child(void *arg)
{
    int s;
    pid_t ret;
    ret = 待機(&s);
    if (ret == -1 && errno == ECHILD) perror("偽の LinuxThreads が検出されました");
    NULL を返します。    
}

int main(int argc, char ** argv)
{
    pid_t pid = fork();
    if (pid == -1) リターン 1;

    // 子は待ってから死ぬ
    もし (pid == 0)
    {
        スリープ (3);
        0 を返します。
    }

    pthread_t wt;
    pthread_create(&wt, NULL, wait_for_child, NULL);
    pthread_join(重量、NULL);
    0 を返します。
}
于 2009-06-24T23:41:09.477 に答える
0

カーネルのパッチについて考え始めたら、アップグレードについて考える時が来ました。2.4は歯がとても長いです。

于 2009-06-23T16:41:46.743 に答える