2

私はスレッド プログラミングが初めてで、C でスレッド プログラミングを学習している段階です。

この単純なコードはコンパイルおよび実行されますが、「hello world」と数字の 8 の両方が出力されると思っていましたが、そうではありません。誰かがこれの理由を知っていますか?

void *threadfunc(void *input_data){  
    printf("Hello World");  
    long tid;  
    tid=(long)input_data;  
    printf("thread ID: &d", tid);  
    return NULL;  
    sleep(1);  
}  
int main(){  

    long t = 8;  
    int t1;  
    pthread_t thread_obj;  
    t1= pthread_create(&thread_obj, NULL,threadfunc, (void*)t);  
}*  

前もって感謝します!:)

4

4 に答える 4

8

最初に、おそらくどこかで電話pthread_joinをかけたいと思うでしょう。pthread_createそうしないと、メインスレッドが終了する場合、新しいスレッドが実行される機会が得られない可能性があります(かなり良い) 。

言い換えると、スレッドが1つになるexitと、それらはすべて実行されます。プロセスは他のスレッドを「待機」しません。


また、通話に改行を追加することもできますprintf

于 2012-08-31T13:30:51.887 に答える
3

プログラムは関数の終わりで終了しmainます。あなたが電話した直後にあなたのプログラムのどれがpthread_create。したがって、スレッドを実行する機会はありません。

スレッドを実行する機会を与えるには、メイン関数にスレッドが完了するのを待たせる必要があります。を呼び出すことによってpthread_join

于 2012-08-31T13:31:35.907 に答える
0

ローカル変数 t t1= pthread_create(&thread_obj, NULL,threadfunc, (void*)&t); のアドレスを渡す必要があります。

スレッド関数は次のようになります

void *threadfunc(void *input_data){  
printf("Hello World");  
long tid;  
tid=*(long *)input_data;  
printf("thread ID: %ld", tid);  
sleep(1);  
}  
于 2012-08-31T14:38:49.333 に答える
0

他の人が言うこと(終了する前に何かを印刷する機会を与える)に加えて、間違ったフォーマット指定子で印刷しているため、基本的にスレッドへの変数の転送が間違っています。試す

tid = *(long*)input_data;  
printf("thread ID: %ld\n", tid);

&tの代わりにスレッド関数を呼び出します(void*)t。(long常に適切にポインターに変換されるとは限りません。)

于 2012-08-31T14:03:03.800 に答える