在2.4内核的多线程应用程序中等待失败

时间:2009-06-23 16:07:51

标签: linux-kernel pthreads wait

我有一个多线程的应用程序 - 一个线程负责用wait()收集死孩子,另一个线程根据请求用fork生成它们。

我发现在一个拥有2.4内核和LinuxThread的平台上,等待总是因ECHILD而失败。我发现问题可能出在2.4内核上LinuxThreads的非POSIX兼容实现中,following discussion表明没有办法解决这个问题。

我仍然想确定没有人知道任何解决方案。即使是内核的补丁也是可以接受的。

当我考虑应用程序设计时,我认为不可能在单个线程中执行fork()和wait()(或者只需付出巨大的努力)

2 个答案:

答案 0 :(得分:1)

在我看来,这种(显然是虚假的)行为是LinuxThreads实现的特性。

似乎只有两种方法 - 要么切换到NPTL(需要内核2.6),要么避免使用这种多线程的fork / wait模型(这是我解决问题的方法,而且很难让架构变得复杂一点复杂的,它仍然可以在一天内完成。

以下示例是在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 = wait(&s);
    if (ret == -1 && errno == ECHILD) perror("Bogus LinuxThreads encountered");
    return NULL;    
}

int main(int argc, char ** argv)
{
    pid_t pid = fork();
    if (pid == -1) return 1;

    // child waits and then dies
    if (pid == 0)
    {
        sleep(3);
        return 0;
    }

    pthread_t wt;
    pthread_create(&wt, NULL, wait_for_child, NULL);
    pthread_join(wt, NULL);
    return 0;
}

答案 1 :(得分:0)

如果您开始考虑内核补丁,那么就该考虑升级了。 2.4牙齿很长。