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

Linux kernel 在2.4内核的多线程应用程序中等待失败,linux-kernel,pthreads,wait,Linux Kernel,Pthreads,Wait,我有一个多线程的应用程序——一个线程负责用wait()收集死去的子线程,另一个线程根据请求用fork生成它们 我发现在一个有2.4内核和LinuxThread的平台上,ECHILD的等待总是失败的。我发现这个问题可能是在2.4内核上LinuxThreads的非POSIX兼容实现中出现的,这表明无法解决这个问题 不过我还是想确定没有人知道任何解决方案。即使是内核补丁也是可以接受的 当我考虑应用程序设计时,我认为不可能在一个线程中同时执行fork()和wait()(或者只需付出巨大的努力)如果您开始

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

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

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


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

如果您开始考虑内核补丁,那么现在是考虑升级的时候了。2.4已经很长时间了。

如果你开始考虑内核补丁,那么是时候考虑升级了。2.4非常长。

在我看来,这种(显然是假的)行为是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; } #包括 #包括 #包括 #包括 void*等待子对象(void*arg) { int-s; pid_t ret; ret=等待(&s); 如果(ret==-1&&errno==ECHILD)perror(“遇到伪LinuxThreads”); 返回NULL; } int main(int argc,字符**argv) { pid_t pid=fork(); 如果(pid==-1)返回1; //孩子等待,然后死去 如果(pid==0) { 睡眠(3); 返回0; } pthread_t wt; pthread_create(&wt,NULL,wait_for_child,NULL); pthread_join(wt,NULL); 返回0; } 在我看来,这种(显然是假的)行为是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; } #包括 #包括 #包括 #包括 void*等待子对象(void*arg) { int-s; pid_t ret; ret=等待(&s); 如果(ret==-1&&errno==ECHILD)perror(“遇到伪LinuxThreads”); 返回NULL; } int main(int argc,字符**argv) { pid_t pid=fork(); 如果(pid==-1)返回1; //孩子等待,然后死去 如果(pid==0) { 睡眠(3); 返回0; } pthread_t wt; pthread_create(&wt,NULL,wait_for_child,NULL); pthread_join(wt,NULL); 返回0; }
我认为除了升级到基于2.6内核的发行版,使用符合POSIX标准的线程库之外,不会有任何建议?处理子进程非常棘手,有太多的竞争条件需要考虑。我认为除了升级到基于2.6内核的发行版,使用符合POSIX标准的线程库之外,不会有任何建议。介意展示一些代码吗?处理子进程非常棘手,有太多的竞争条件需要考虑。2.4肯定已经推出很长时间了,但它仍然受到一些嵌入式项目的青睐,其中内核映像大小是一个问题。有关PPC上的尺寸比较,请参阅。就我个人而言,我会升级到2.6.x,因为这些改进超过了尺寸的增加,但这只是我的问题。事实也是如此。对于给定的平台,供应商仅支持2.4系列。这在许多其他方面都是痛苦的。2.4肯定已经推出很长时间了,但它仍然受到一些嵌入式项目的青睐,因为内核映像大小是一个问题。有关PPC上的尺寸比较,请参阅。就我个人而言,我会升级到2.6.x,因为这些改进超过了尺寸的增加,但这只是我的问题。事实也是如此。对于给定的平台,供应商仅支持2.4系列。这在许多其他方面是痛苦的。