2013-03-07 2 views
1

Я не могу отлаживать следующую программу, так как у меня нет linux дома. Я не могу выполнить программу, но пока я составлял программу в лабораторном сеансе, я получил две ошибки. Может кто-нибудь мне помочь? Если кто-то сможет выполнить эту программу после ее отладки, пожалуйста, опубликуйте результат, пожалуйста.POSIX темы и семафоры

Код выглядит следующим образом:

#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; 

} 

после внесения изменений и исправлений им получить следующий результат прямо сейчас, не является искомым .......

[[email protected] sree58]# gcc producerconsumer.c -lpthread -lrt 
producerconsumer.c: In function ‘producer’: 
producerconsumer.c:54: warning: return makes pointer from integer without a cast 
[[email protected] 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 

пожалуйста кто-то ведет меня ......

+2

Какие ошибки? Я, например, не предоставляю бесплатную службу отладки. –

+0

Я знаю ..... но PLS помочь мне ...... им просить помощи, потому что у меня нет linux дома .... и я должен отправить эту программу завтра .... ошибки связаны с Функция init(), я думаю ..... PLS, помогите мне .... – chinu

+2

Попробуйте использовать любую свободную онлайн-версию IDE: s. Думаю, они, скорее всего, построят Linux-подобную среду. – unwind

ответ

1

Я составлял программу в лабораторном сеансе, у меня есть две ошибки ..... может кто-нибудь мне помог ????

1) Удалить для контура первоначального объявления в for(int j=0;j<BUFFER_SIZE;j++);, или скомпилировать с опцией -std=c99

2) Ссылка с библиотекой Pthread.

gcc main.c -lpthread 

Было также множество предупреждений, позаботьтесь об их устранении.

- EDIT -

В вашем remove_item(), возвращение изменений; для возврата 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 
;;;;;;;; 
;;;;;;;; 
;;;;;;;; 
;;;;;;;; 
+0

этот ouptut до исправления ошибки оператора return в функции removeitem .... right ???? – chinu

+0

no после исправления заявления о возврате –

+0

ohhhk thanks ..... это означает, что все еще что-то не так с моей программой ..... потребитель не потребляет товар ..... правильно ???? – chinu

5

Во-первых, давайте обратимся это (инструменты, чтобы помочь себе): since i don't have linux at home

Перейти на сайт компании Oracle и скачать VirtualBox затем перейти на сайт вашего любимого Linux дистрибутиве и загрузить изображение .iso (например, если вы чувствовали себя Minty, вы могли бы получить iso here)

Затем вы можете следовать инструкциям se t и «установить» iso на виртуальной машине и вуаля! У вас есть Linux дома. ;)

Во-вторых, я обращусь это: i got two errors

В самом деле? Как вы это компилируете? При запуске вашего кода с помощью 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 

Теперь у вас есть куча (важно) предостерегающий gs:

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] 
+0

спасибо за руководство ....... ........ – chinu

+0

@chinu - приветствую вас, и если у вас возникли проблемы с настройкой VirtualBox, вы можете спросить на сайте [Superuser] (http://superuser.com/). – Mike

+0

Я проверил для виртуальной коробки сейчас ...... но информация о сайте говорит, что мне нужно иметь 64-битную конфигурацию на моем ПК ..... но у меня 32-битная конфигурация ........ – chinu

Смежные вопросы