Linux + uClibc + pthread (C): приложение зависает в конце - PullRequest
1 голос
/ 04 декабря 2011

Я пытаюсь построить свою собственную встроенную систему uClibc.Я столкнулся с некоторыми проблемами, но через 2 дня решил их все.Осталось только одно: pthread работает неправильно.Вот простая программа из скрипта configure python:

#include <pthread.h>

void* routine(void* p){return NULL;}

int main(){
  pthread_t p;
  if(pthread_create(&p,NULL,routine,NULL)!=0)
    return 1;
  (void)pthread_detach(p);
  return 0;
}

В моей системе на основе glibc она запускается и затем завершается.Но в моей системе на основе uclibc она запускается, завершает потоки и зависает:

[Thread debugging using libthread_db enabled]
[New Thread 0x801 (LWP 17631)]
[New Thread 0x402 (LWP 17632)]
[Thread 0x402 (LWP 17632) exited]
[Thread 0x801 (LWP 17631) exited]
^C
Program received signal SIGINT, Interrupt.
0xb7f768e7 in sigsuspend () from /lib/libc.so.0

Я пробовал как старые, так и новые linuxthreads, но ни одна из них не работала.У вас есть идея?

Редактировать:

ОК, я нашел больше информации:

#include <pthread.h>
#include <stdio.h>
void* routine(void* p){printf("AAA!\n");return NULL;}

int main(){
  pthread_t p;
  pthread_create(&p,NULL,&routine,NULL);
   printf("BBB!");
  (void)pthread_detach(p);
  pthread_exit(0);
  exit(0);
}

печатает только «AAA!», Затем останавливается (печатает система glibcи «AAA!» и «BBB!» в случайном порядке).Так что я думаю, что должна быть какая-то ошибка в самой uclibc pthreads.Любая другая помощь?Пробовал некоторые другие тесты pthread и каждый из них зависает в конце.Редактировать: я не выяснил, почему это происходит, но я скопировал предварительно скомпилированный uclibc, и теперь он работает.

1 Ответ

1 голос
/ 04 декабря 2011

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

Если естьдругие потоки не выполняются, это становится неактивным, так что в любом случае вызывать его не повредит.

...