1

独自の uClibc 組み込みシステムを構築しようとしています。いくつか問題が発生しましたが、2 日後にはすべて解決しました。残っているのは 1 つだけです:pthread正しく動作しません。これは、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 を試しましたが、どれも機能しませんでした。アイデアはありますか?

編集:

OK、さらに情報を見つけました:

#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!" の両方をランダムな順序で出力します)。したがって、ulibc pthreads 自体に何らかのエラーがあるに違いないと思います。他に助けはありますか?他の pthread テストをいくつか試してみましたが、それぞれが最終的にフリーズします。編集:なぜこれが起こっているのかわかりませんでしたが、コンパイル済みの uclibc をコピーしたところ、現在は動作しています。

4

1 に答える 1

1

メインスレッドが最後に実行されていることを別の方法で確認していない場合は、戻る前mainに呼び出しpthread_exit()て、他のすべてのスレッドが終了するのを待つ必要があります。

他に実行中のスレッドがない場合、それはノーオペレーションになるので、とにかくそれを呼び出すことに害はありません。

于 2011-12-04T19:38:29.323 に答える