2012-04-19 3 views
-8

синхронизация Я начинаю с потоками и у меня возникают некоторые проблемы, разрешающие это:Pthread C

Эта программа производит упорядоченную последовательность числа и вторая задача читает их и выводит их на экран. Как отремонтировать это для работы по мере необходимости?

Ожидаемый выход:

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"); 
} 
+3

«Исправить эту программу» определенно не является хорошим способом описания вашей проблемы. Вам нужно правильно определить и описать вашу проблему, чтобы получить хорошие ответы. –

+1

Каков ожидаемый результат (или результат) и что такое фактическое? Другими словами, в чем ваша проблема? –

+0

Несомненно! Это изменилось! – dani

ответ

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

являются глобальными и доступны из нескольких потоков, они не имеют каких-либо synchronization.
race condition, что следует, является проблемы, если не проблемы.

Смелые встроенные ссылки должны дать вам по крайней мере головной убор в том, что вы делаете неправильно.

+0

Возможно, это тоже полезно: [Доступ к глобальным переменным в pthreads в разных файлах c] (http://stackoverflow.com/questions/7382636/accessing-global-variables-in-pthreads-in-different-c-files) – nacho4d

2

Общие ресурсы необходимы, по крайней мере, для блокировки и передачи данных, как правило, решаются с помощью связи потоков через переменные состояния, см. this example (C++, но это показывает мою точку зрения).

Редактировать: в этом случае странный вывод обусловлен тем, что вы используете небольшой буфер в сочетании с более медленным потребителем, чем производитель.