2

次のコードを作成しようとしていますが、無駄です。誰かが助けることができますか?

継続的にループし、ユーザーに整数の入力を求めるスレッドを作成します。2 番目のスレッドは 10 秒間スリープし、次のように表示します。. その後、スリープ状態に戻り、繰り返します。

私は非常に混乱して立ち往生しています。誰か助けてくれませんか

これが今までのコードです

pthread_create(&thread1, NULL, &inputfunction, NULL);
        pthread_create(&thread2,NULL, &inputfunction, NULL);
        pthread_join(thread1,NULL);
       // pthread_join(thread2,NULL);
//        pthread_mutex_init(&array_lock, NULL);
        return 0;
}

void *inputfunction()
{
        //int *values= ptr_value;
        int i;
        int arr[5];
        printf("Input values:");
        for (i=0;i<5;i++)
        scanf("%d",&arr[i]);
        sleep(10);

        int max=0;
        for (i=0;i<5;i++)
                {
                        if (arr[i]>max)
                                max=arr[i];
                }
        printf("max=",max);

        return NULL;


}
4

2 に答える 2

5

これは宿題のように思えるので、コードは書きませんが、少し分析すると、ここで問題をよりよく理解するのに役立つかもしれません。

要件の分析とその分析方法

ユーザーから変数を受け取って格納するジョブと、10 秒ごとに起動して現在の入力値を読み取る別のスレッドの 2 つの別個のスレッドが必要です。
2 つのスレッドが必要であるという明白な事実は別として、格納読み取りに重点が置かれていることに注意してください。これは、2 つの異なるスレッドから同じ変数にアクセスする必要があることを意味し、グローバル変数である必要があることを示しています。

現在のコードの何が問題になっていますか?
2 つのスレッドで問題ありませんが、2 つのスレッドで異なるアクティビティを実行する必要があるため、2 つの異なるスレッド関数も必要です。したがってinputfunction()、両方のスレッドで同じ関数を再利用することはできません。2 つの異なる関数が必要になります。ここでは、Q の最初の部分で各関数が何をすべきかの内訳を既に示しています。
ヒント:タイマーについては、環境(Windows / Linuxなど)のドキュメントを確認し、独自の関数をコールバック関数として登録してください。これにより、別のスレッドを完全に生成する必要が実際に簡素化されます。

また、2 つのスレッド間で同じグローバル変数にアクセスする必要があります。これは、2 つのスレッドが共有変数にアクセスするために競合する可能性があることを意味するため、これを回避するには何らかの同期メカニズムが必要です。

上記の分析により、プログラミングを開始し、プログラミングを試みます。問題が発生した場合は、ここで、試したことと直面している問題の具体的な詳細を記載して、お気軽に質問してください。

ではごきげんよう :)

于 2012-05-23T03:08:19.613 に答える
2

スレッド 1 とスレッド 2 の境界をあいまいにする関数を 1 つだけ作成しました。

  • ループは 5 回だけです (説明書では要求されていません!)。
  • 入力を読み取ります(スレッド1の一部)
  • 眠る (スレッド 2 の一部)
  • 5 つの整数の配列を維持します(説明では要求されていません!)

指示に従うだけで、さらに先に進むことができます。

継続的にループするスレッドを作成し、ユーザーに整数の入力を求めます。

/* global */  int g_i;

void Thread_One_Main(void)
{
    g_i = 0;
    while( g_i != -1)
    {
        scanf("%d", &g_i);
    }
}

2 番目のスレッドは 10 秒間スリープし、それまでに入力された最大値を表示します。
その後、スリープ状態に戻り、繰り返します。

void Thread_Two_Main(void)
{
    int max = 0;
    while(g_i != -1)
    {
        sleep(10);
        if (g_i > max)
        {
            max = g_i;
            printf("New max value: %d\n", max);
        }
    }
}

PSプログラムがいつ、どのように終了するかについて何も言及しなかったので、停止値として -1 を使用することにしました。

さて、main()これらの両方のスレッドを開始するために a を記述できますか?

2 つのスレッド間で同期して、g_i から同時に読み書きしないようにすることはできますか?

于 2012-05-23T03:12:31.950 に答える