2009-06-23 6 views
1

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

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

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

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

+1

Я не думаю, что будут какие-либо советы, кроме как перейти на дистрибутив на основе ядра 2.6, с библиотекой потоковой передачи, совместимой с POSIX. –

+0

Ум показывает некоторый код? Обращение с детским процессом обманчиво сложно, есть много условий гонки, о которых нужно думать. – nos

ответ

0

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

+0

2.4 определенно отсутствовал в течение длительного времени, но он по-прежнему пользуется некоторыми встроенными проектами, в которых размер образа ядра является проблемой. См. Http://denx.de/wiki/Know/Linux24vs26 для сравнения размеров по PPC. Лично я обновлялся до 2.6.x, потому что улучшения увеличивают размер, но это только я. – ctuffli

+0

И это было так. Для данной платформы, к сожалению, поставщик поддерживает только 2,4 серии. Это больно во многих других аспектах. –

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; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^