2012-04-19 46 views
-8

我开始了与线程和我有一些问题解决的:Pthread的Ç同步化

这个程序会产生数的有序序列和第二个任务读取它们并将它们打印在屏幕上。如何根据需要修复此问题?

预期输出:

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

“修复此程序”绝对不是描述问题的好方法。您需要正确指出并描述您的问题以获得良好回应 – 2012-04-19 06:40:31

+1

预期结果(或输出)是什么以及实际结果如何?换句话说,你的问题是什么? – 2012-04-19 06:41:25

+0

当然!它改变了! – dani 2012-04-19 06:41:36

回答

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

是全球性的,并从多个线程访问,他们没有任何synchronization
下面的race condition一个问题,如果不问题。

内在联系的强化应该让你至少在你做错了什么的头痛。

+0

这可能也有帮助: [在不同c文件中访问pthreads中的全局变量](http://stackoverflow.com/questions/7382636/accessing-global-variables-in-pthreads-in-different-c-files) – nacho4d 2012-04-19 06:45:36

2

共享资源至少需要锁定和传递数据通常通过条件变量的线程通信来解决,参见this example(C++,但它显示了我的观点)。

编辑:在这种情况下,奇怪的输出是由于你使用一个小的缓冲区和比生产者慢的消费者。