1

自宅に Linux がないため、次のプログラムをデバッグできません。プログラムを実行できませんが、ラボ セッションでプログラムをコンパイルしているときに、2 つのエラーが発生しました。誰でも私を助けることができますか?誰かがデバッグ後にこのプログラムを実行できる場合は、出力を投稿してください。

コードは次のとおりです。

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#define BUFFER_SIZE 10
sem_t empty;
sem_t full;
pthread_mutex_t mutex;

int buffer[BUFFER_SIZE];

pthread_t ptid,ctid;
pthread_attr_t attr;

void *producer(void *param);
void *consumer(void *param);

int counter;
int main()
{

  init();
  pthread_create(&ptid, &attr, producer, NULL);
  pthread_create(&ctid, &attr, consumer, NULL);
  pthread_join(ptid,NULL);
  pthread_join(ctid,NULL);

  return 0;
}

void init()
{
  pthread_mutex_init(&mutex, NULL);
  pthread_attr_init(&attr);
  sem_init(&full, 0, 0);
  sem_init(&empty, 0, BUFFER_SIZE);
  counter = 0;
  for(int j=0;j<BUFFER_SIZE;j++)
  {  buffer[j] = 0;}
}

void *producer(void *param)
{
int item;
  while(1)
  {
    item=item+1;
    sem_wait(&empty);
    pthread_mutex_lock(&mutex);

    if(insert_item(item))
    {
      perror("Producer error.");
      return 1;
    }
    else
    {
      printf("Producer produced %d\n", item);
    }

    pthread_mutex_unlock(&mutex);
    sem_post(&full);
  }
}

void *consumer(void *param)
{
  int item;
  while(1)
  {
sleep(5);
    sem_wait(&full);
    pthread_mutex_lock(&mutex);
    if(remove_item(item))
    {
      perror( "Consumer error.");
    }
    else
    {
      printf("Consumer consumed %d\n", item);
    }

    pthread_mutex_unlock(&mutex);
    sem_post(&empty);
  }
}
int insert_item(int item)
{
  if(counter < BUFFER_SIZE)
  {
    buffer[counter] = item;
    counter++;
    return 0;
  }
  else
    return -1;

}

int remove_item(int item)
{
  if(counter > 0)
  {
    item = buffer[(counter-1)];
    counter--;
    return ;
  }
  else
    return -1;

}

変更と修正を行った後、次の出力が得られますが、これは目的のものではありません........

[root@localhost sree58]# gcc producerconsumer.c -lpthread -lrt
producerconsumer.c: In function ‘producer’:
producerconsumer.c:54: warning: return makes pointer from integer without a cast
[root@localhost sree58]# ./a.out
Producer produced 1804289383
Producer produced 846930886
Producer produced 1681692777
Producer produced 1714636915
Producer produced 1957747793
Producer produced 424238335
Producer produced 719885386
Producer produced 1649760492
Producer produced 596516649
Producer produced 1189641421
Consumer error.: Success
Producer produced 1025202362
Consumer error.: Illegal seek
Producer produced 1350490027
Consumer error.: Illegal seek
Producer produced 783368690
Consumer error.: Illegal seek
Producer produced 1102520059
Consumer error.: Illegal seek
Producer produced 2044897763
Consumer error.: Illegal seek
Producer produced 1967513926
Consumer error.: Illegal seek
Producer produced 1365180540
Consumer error.: Illegal seek
Producer produced 1540383426
Consumer error.: Illegal seek
Producer produced 304089172
Consumer error.: Illegal seek
Producer produced 1303455736
Consumer error.: Illegal seek
Producer produced 35005211
Consumer error.: Illegal seek
Producer produced 521595368
Consumer error.: Illegal seek
Producer produced 294702567
Consumer error.: Illegal seek
Producer produced 1726956429

誰か私を案内してください......

4

2 に答える 2

6

まず、これに対処しましょう (自分自身を支援するツール):since i don't have linux at home

Oracle のサイトにアクセスしてVirtualBoxをダウンロードしてから、お気に入りの Linux ディストリビューションのサイトにアクセスしてその.isoイメージをダウンロードします (たとえば、Minty を使用している場合は、ここで iso を入手できます) 。

次に、指示に従って、仮想マシンに iso をセットアップして「インストール」します。自宅に Linux があります。;)

第二に、私はこれに対処します:i got two errors

本当に?これをどのようにコンパイルしていますか?でコードを実行すると、大量の警告と 1 つのエラーが表示されますgcc -Wall。1 つのエラーは、メッセージでそれを修正する方法も示しています。

38:3: error: ‘for’ loop initial declarations are only allowed in C99 mode
38:3: note: use option -std=c99 or -std=gnu99 to compile your code

そのコマンドを追加するとgcc -Wall -std=c99、pthread ライブラリが見つからないため、未定義の参照が表示されます。

undefined reference to `pthread_create'

それをリンクすることで修正されます:

gcc -Wall -std=c99 <yourfile>.c -lpthread

これで、一連の (重要な) 警告が表示されます:

In function ‘main’:
22:3: warning: implicit declaration of function ‘init’ [-Wimplicit-function-declaration]
At top level:
31:6: warning: conflicting types for ‘init’ [enabled by default]
22:3: note: previous implicit declaration of ‘init’ was here

In function ‘producer’:
51:5: warning: implicit declaration of function ‘insert_item’ [-Wimplicit-function-declaration]
54:7: warning: return makes pointer from integer without a cast [enabled by default]

In function ‘consumer’:
71:1: warning: implicit declaration of function ‘sleep’ [-Wimplicit-function-declaration]
74:5: warning: implicit declaration of function ‘remove_item’ [-Wimplicit-function-declaration]

In function ‘remove_item’:
106:5: warning: ‘return’ with no value, in function returning non-void [enabled by default]

In function ‘consumer’:
74:19: warning: ‘item’ is used uninitialized in this function [-Wuninitialized]
于 2013-03-07T16:36:06.440 に答える
1

ラボ セッションでプログラムをコンパイルしていたところ、2 つのエラーが発生しました。誰か助けてくれませんか????

1) for 内の for ループの初期宣言を削除するfor(int j=0;j<BUFFER_SIZE;j++);か、オプションを付けてコンパイルする-std=c99

2) pthread ライブラリとリンクします。

gcc  main.c -lpthread

たくさんの警告もありました。それらを修正するように注意してください。

- 編集 -

remove_item() で、 return; を変更します。0 を返します。

ここに出力があります

Producer produced 4001537
Producer produced 4001538
Producer produced 4001539
Producer produced 4001540
Producer produced 4001541
Producer produced 4001542
Producer produced 4001543
Producer produced 4001544
Producer produced 4001545
Producer produced 4001546
Consumer consumed 4001536
Producer produced 4001547
Consumer consumed 4001536
Producer produced 4001548
Consumer consumed 4001536
Producer produced 4001549
Consumer consumed 4001536
Producer produced 4001550
Consumer consumed 4001536
Producer produced 4001551
Consumer consumed 4001536
Producer produced 4001552
Consumer consumed 4001536
Producer produced 4001553
Consumer consumed 4001536
Producer produced 4001554
Consumer consumed 4001536
Producer produced 4001555
Consumer consumed 4001536
;;;;;;;;
;;;;;;;;
;;;;;;;;
;;;;;;;;
于 2013-03-07T16:28:31.507 に答える