2011-12-04 52 views
1

我試圖建立自己的uClibc嵌入式系統。我遇到了一些問題,但2天后,我解決了所有問題。剩下的只有一個:pthread無法正常工作。 下面是簡單的程序,從蟒蛇的配置腳本: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; 
} 

在我的基於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); 
} 

打印,然後凍結(glibc的系統打印兩個 「AAA!」 和:

OK,我發現了一些更多的信息 「AAA!」 「BBB」!訂購)。所以我認爲uclibc pthreads本身肯定有一些錯誤。任何其他幫助? 嘗試了一些其他的pthread測試,最終每個測試都凍結了。 編輯:我沒有找出爲什麼這個髮型,但我複製了預編譯的uclibc,現在它的作品。

+0

我在ARM cortex_A8平臺上用uClibc 0.9.30.2測試了你的代碼,它工作正常。 –

回答

1

如果您沒有通過另一種方式確保主線程是最後一個正在運行,main需要在返回之前調用pthread_exit(),以等待所有其他線程終止。

如果沒有其他線程在運行,那麼這個線程將變爲空閒線程,因此無論如何調用它都沒有什麼壞處。

+0

那是不錯,但glibc的與這個沒有問題... ... – user1080431

+0

glibc的是很多比uClibc的更寬鬆的,並會默默地修復了檢測錯誤。 –