зомбированные потоки в ps (для многопоточной программы, написанной на c)

Боюсь, я не уверен, что я делаю неправильно здесь. У меня есть многопоточное приложение, которое запускает 3 потока при запуске

[root@Embest /]# ps 
1111 root        608 S   fw634c_d_cdm_sb
1112 root        608 S   fw634c_d_cdm_sb
1113 root        608 S   fw634c_d_cdm_sb

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

1114 root            Z   [fw634c_d_cdm_sb]
...
...
...
1768 root            Z   [fw634c_d_cdm_sb]

около 628 из них.

Дело в том, что политика, которой я следую:

- для отсоединяемых тем - пофиг (они сами выйдут и освободит ресурсы после завершения)

- для присоединяемых потоков - я запускаю pthread_join после запуска pthread_create и жду завершения функции с потоком. нравится:

        if (pthread_create(&tmp_thrd_id,&attr_joinable,run_function,(void *)&aStruct)!=0){
            DEBUG(printf("thread NOT created \n"));
        }else{
            DEBUG(printf("thread created !\n"));

            if (pthread_join(tmp_thrd_id,NULL)!=0){ 
                DEBUG(printf("\nERROR in joining \n"));
            }else{
                            DEBUG(printf("Thread completed\n"));
            }
        }

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

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

Спасибо за помощь


person nass    schedule 13.02.2012    source источник
comment
600 потоков? Вы звоните pthread_create куда-то еще?   -  person cnicutar    schedule 13.02.2012
comment
Вы на какой ОС? Судя по наблюдаемому вами фиктивному поведению pthread и выводу ps, я предполагаю, что это Linux 2.4 с LinuxThreads, но это действительно должно быть частью вопроса...   -  person R.. GitHub STOP HELPING ICE    schedule 13.02.2012
comment
@cnicutar да, в нескольких частях кода создаются потоки.   -  person nass    schedule 13.02.2012
comment
@R .. бинго, ОС - это ядро ​​​​2.4 на плате ARM. Я запускаю gdbserver на плате и подключаюсь через последовательный порт к gdb (кстати (gdb) информация о потоках показывает только 3 потока, когда ps показывает 60+ зомби)   -  person nass    schedule 13.02.2012
comment
Что ж, если вы используете LinuxThreads, одна из трудностей, с которой вам придется столкнуться, заключается в том, что у вас на самом деле нет потоков POSIX; у вас есть API, который внешне похож на pthreads, но с радикально другим (и нарушенным IMO) поведением. Я думаю, что справочная страница Linux для pthreads описывает некоторые проблемы с LinuxThreads, но для уродливого поведения, подобного этому, вам, возможно, придется копаться в исходниках...   -  person R.. GitHub STOP HELPING ICE    schedule 13.02.2012
comment
@R .. хм, я понятия не имел об этом .. как я могу проверить, использую ли я Linuxthreads или pthreads?   -  person nass    schedule 13.02.2012
comment
Если вы работаете в Linux 2.4, вы используете LinuxThreads. Linux 2.4 был слишком сломан на стороне ядра, чтобы поддерживать совместимую реализацию pthreads.   -  person R.. GitHub STOP HELPING ICE    schedule 13.02.2012


Ответы (1)


Поток-зомби — это завершенный поток, ожидающий, пока кто-нибудь вызовет функцию pthread_join, чтобы получить информацию о его статусе выхода. Итак, где-то в вашей программе вы создаете потоки и в конечном итоге не вызываете pthread_join или pthread_detach для этих потоков.

person Chris Dodd    schedule 13.02.2012
comment
это было и моим первоначальным предположением, но я дважды проверил код. В конце концов, ошибка возникла из-за несоответствия библиотек. - person nass; 15.02.2012