2011-12-04 7 views
1

私自身のuClibc組み込みシステムを構築しようとしています。私はいくつかの問題に遭遇しましたが、2日後にすべてを解決しました。 1つだけ残っています:pthreadは正しく動作しません。ここで はPythonのconfigureスクリプトから簡単なプログラムです:私はglibcベースのシステムでLinux + uClibc + pthread(C):最後にアプリケーションがフリーズする

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

、それが実行され、終了します。 しかし、私の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、私はいくつかのより多くの情報が見つかりました: "!AAA"

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

プリントのみを、そして(glibcのシステム版画の両方フリーズするとランダムで "AAAを!" "BBB!"注文)。ですから、uclibc pthreads自体には何らかのエラーがあるはずです。その他のヘルプ? いくつかの他のpthreadテストを試してみて、それぞれのテストが終了しました。 編集:私はなぜこのhapenningですが、私は知りませんでしたが、私はプリコンパイルされたuclibcをコピーして、今すぐ動作します。

+0

私はあなたのコードをARM cortex_A8プラットフォームのuClibc 0.9.30.2でテストし、正しく動作します。 –

答えて

1

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

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

+0

素晴らしいですが、glibcはこれに問題はありません... – user1080431

+0

glibcはuClibcよりもはるかに許容性があり、検出可能なエラーを静かに修正します。 –

関連する問題