何をするか。

何をするか。

スレッドを正しい順序で出力する際に​​問題があります。私のプログラムは少なくとも 2 つのパラメータを取る必要があります (パラメータはもっと多くてもかまいませんが、1 つは整数 (スレッドが何秒待機するか)、もう 1 つは char* (通常のメッセージ) なので、常に 2 つずつです)。プログラムの出力はスレッド番号 (インデックス) と 2 番目のパラメータからのメッセージですが、スレッドは最初のパラメータからの時間に基づいてソートする必要があります。メイン スレッドは他のすべてのスレッドを待機する必要があります。スレッドは最大 10 個になります。

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


void* thread_main(void* arg){
    sleep(1);
    return NULL;
}

int main(int argc, char** argv){
    pthread_t tid[10];
    int s;

    int index=0;
    for(int i=1;i<argc;i+=2){
      int param1= atoi(argv[i]);
      char* param2= argv[i+1];

      s=pthread_create(&tid[index],NULL,thread_main,NULL);
      usleep(param1*1000);
      printf("Thread %d : %s\n",index+1,param2);
      index++;
    }
    
    for(int i=0;i<index+1;i++){
      s=pthread_join(tid[i],NULL);
    }    
    
    return 0;
}

これは私のコードです。コードのパラメータを入力すると、

300 これは最後です 100 これは最初です 200 これは真ん中です

出力は次のようになります。

Thread 2 : this_is_first
Thread 3 : this_is_middle
Thread 1 : this_is_last

しかし、私のコードでは次のようになります:

Thread 1 : this_is_last
Thread 2 : this_is_first
Thread 3 : this_is_middle

私はスレッド初心者なので、これを修正する方法が本当にわかりません。

答え1

コードを見ると、スレッド内に出力はありません。したがって、スレッドは何もしません。create_threadを削除すると、その通り同じこと。

出力は順番に行われます。時間は異なります (偶数パラメータに応じて)。

また、すべてのスレッドは thread_main と呼ばれます。

何をするか。

さまざまな遅延とをprintfthread_main に配置します (適切な名前を付けます)。次に、メッセージと ID をスレッドに渡す必要があります。

見るマニュアル実行方法の例については、tinfoスレッドに渡されるメモを参照してください。

まず、スレッドごとに異なるメッセージと ID を持つ 3 つのルーチンを用意します。これが機能したら、起動時に情報を渡す方法を検討し始めます。

関連情報