-9

私はスレッドから始めていますが、これを解決するのにいくつか問題があります:

このプログラムは、番号の順序付けられたシーケンスを生成し、2 番目のタスクがそれらを読み取り、画面に出力します。必要に応じてこれを修復するにはどうすればよいですか?

期待される出力:

Consumed item: 1
Consumed item: 2
Consumed item: 3
Consumed item: 4
Consumed item: 5
Consumed item: 6

実際の出力:

Consumed item: 1
Consumed item: 4
Consumed item: 7
Consumed item: 10
Consumed item: 11
Consumed item: 14

プログラム:

#include <stdio.h>
#include <pthread.h>
#include <time.h>

#define          NBUFFERS       2

int item, in=0, out=0;
int buffer[NBUFFERS];
int stop =0; 

void *ProducerTask(void *data) //This is the producer task
{
     int nextp = 0;
     struct timespec mytime;
     mytime.tv_sec = 0;
     mytime.tv_nsec = 200000000;

     while (!stop) {
          nanosleep(&mytime, NULL);
          nextp++;
          buffer[in] = nextp;   /* produce a new item */
          in = (in + 1) % NBUFFERS;
     }
     pthread_exit(0);
}

void *ConsumerTask(void *data)
{
     int nextc;
     struct timespec mytime;
     mytime.tv_sec = 0;
     mytime.tv_nsec = 500000000;

     while (!stop) {
          nanosleep(&mytime, NULL);
          nextc = buffer[out];  /* consume a item */
          out = (out + 1) % NBUFFERS;
          printf("Consumed item: %d\n", nextc);
     }
     pthread_exit(0);
}

void *MonitorTask (void *data) //This is the monitor task
{
     getchar();
     stop = 1;
     pthread_exit(0);
}

void main(void)
{
     pthread_t task1;
     pthread_t task2;
     pthread_t task3;

     pthread_create (&task1, NULL, ProducerTask, NULL);
     pthread_create (&task2, NULL, ConsumerTask, NULL);
     pthread_create (&task3, NULL, MonitorTask, NULL);

     pthread_join(task1,NULL);
     pthread_join(task2,NULL);
     pthread_join(task3,NULL);

     printf("Main program exiting.\n");
}
4

2 に答える 2

3
int buffer[NBUFFERS];
int stop =0; 

グローバルであり、複数のスレッドからアクセスされますが、同期はありません。
それに続く競合状態問題ではないにしても問題です。

太字のインラインリンクは、あなたが間違っていることで少なくとも有利なスタートを切るはずです.

于 2012-04-19T06:41:57.233 に答える
2

共有リソースには少なくともロックが必要であり、データの受け渡しは通常、条件変数を介したスレッド通信で解決されます( C++ ですが、私の要点を示しています)。

編集:この場合、奇妙な出力は、プロデューサーよりも遅いコンシューマーと組み合わせて小さなバッファーを使用するという事実によるものです。

于 2012-04-19T06:46:34.883 に答える