2011-06-24 11 views
0

私はUnix Cを学び、練習をしています。私が取り組んでいる現在の問題は、POSIXスレッド(主にpthread_create()とpthread_join())に関係します。posixスレッド(pthread_createとpthread_join)

2つのスレッドを使って "Hello World"を繰り返し印刷するように求められます。 1つのスレッドは "Hello"を1000回印刷し、2番目のスレッドは "World"を1000回印刷します。メインのプログラム/スレッドは、処理を進める前に2つのスレッドが終了するのを待つことです。

これは私が今持っているものです。

#include <stdlib.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <pthread.h> 

void *print_hello(void *arg) 
{ 
    int iCount; 
    for(iCount = 0; iCount < 1000; iCount++) 
    { 
    printf("Hello\n"); 
    } 
} 

void *print_world(void *arg) 
{ 
    int iCount; 
    for(iCount = 0; iCount < 1000; iCount++) 
    { 
     printf("World\n"); 
    } 
} 

int main(void) 
{ 
    /* int status; */ 
    pthread_t thread1; 
    pthread_t thread2; 

    pthread_create(&thread1, NULL, print_hello, (void*)0); 
    pthread_create(&thread2, NULL, print_world, (void*)0); 

    pthread_join(thread1, NULL); 
    pthread_join(thread2, NULL); 

    return 0; 
} 

これは完全には機能していないようです。それは "Hello"を期待どおりに印刷します。しかし、 "世界"は全く印刷されていません。 2番目のスレッドがまったく実行されていないようです。私がpthread_joinを正しく使用しているかどうかはわかりません。私の意図は、メインスレッドがこれらの2つのスレッドを「待機」することです。

ご協力いただければ幸いです。

+0

私にはうまく見え、期待どおりに動作します。しかし、あなたのスレッド関数の最後に 'return NULL'を追加したいかもしれません。 – JackOfAllTrades

+0

あなたのコードにコメントするために、NULLは通常 "(void *)0"と定義されます。私はNULLを提案します。ヌルポインタがすべてのシステムで0として表される保証はなく、NULLは適切な値に定義されます。 –

答えて

7

あなたはそれが両方のスレッドを実行していないと思いますか?私は出力が気付いてすぐにあなたを過ぎて叫んでいると思う - あなたは、単一のブロックで各スレッドの出力の多数を得るつもりです。

出力をファイルにリダイレクトし、実際に何が印刷されたかを確認してください。

2

あなたのコードを実行しました。

$ gcc ./foo.c -pthread 
$ ./a.out | grep World | wc -l 
1000 
$ ./a.out | grep Hello | wc -l 
1000 

gcc-4.5.2を使用してUbuntu 10.10で動作します。コンパイルと出力を再度確認してください。

関連する問題