ожидание не удается в многопоточном приложении на ядре 2.4 - PullRequest
1 голос
/ 23 июня 2009

У меня есть приложение, которое является многопоточным - один поток отвечает за сбор мертвых детей с помощью wait (), другой поток порождает их с помощью fork по запросу.

Я обнаружил, что на одной платформе с ядром 2.4 и LinuxThread ожидание всегда завершается с ECHILD. Я обнаружил, что проблема может быть в не-POSIX-совместимой реализации LinuxThreads на ядре 2.4, и после обсуждения предполагает, что нет способа, как это можно решить.

И все же я хотел бы убедиться, что никто не знает ни о каком решении. Даже патч для ядра будет приемлемым.

Когда я думаю о дизайне приложения, я не думаю, что можно было бы выполнить одновременно fork () и wait () в одном потоке (или только с огромными усилиями)

Ответы [ 2 ]

1 голос
/ 25 июня 2009

Мне кажется, что это (очевидно поддельное) поведение является особенностью реализации 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;
}
0 голосов
/ 23 июня 2009

Если вы начинаете задумываться о патчах ядра, то пришло время подумать об обновлениях. 2,4 очень длинный в зубе.

...