2016-06-11 18 views
1

我试图使生产者/消费者应用程序。问题是,我的制作者正在填充整个缓冲区,那么消费者将删除整个缓冲区......当消费者制作一个post到信号量时,消费者是不是应该从缓冲区中删除一个项目?使用生产者和消费者,sempahore在C

我的代码:

void* producerFunc(void* arg) 
{ 
    while(n_insertions < N_PRODUCTS) 
    { 
     sem_wait(&sem_postAvaliable); 
     sem_wait(&mutex); 
     //Insert Item 
     sem_post(&mutex); 
     sem_post(&sem_posTaken); 
    } 
    pthread_exit(NULL); 
} 

void* consumerFunc(void* arg) 
{ 
    while(n_consumed < N_PRODUCTS) 
    { 
     sem_wait(&sem_posTaken); 
     sem_wait(&mutex); 
     //Remove from bufer 
     sem_post(&mutex); 
     sem_post(&sem_postAvaliable); 
    } 
    pthread_exit(NULL); 
} 

n_insertions是一个全球性的整数计算插入缓冲项目的数量;

n_consumed是一个全局整数,用于统计消费者从缓冲区中消耗项目的次数。

+2

这很奇怪,在什么值初始化信号量'sem_postAvaliable'和'sem_posTaken'?此外,您可以使用'pthread_mutex_t'声明一个互斥锁,然后使用'pthread_mutex_lock'和'pthread_mutex_unlock'解锁并锁定该互斥锁。 – OiciTrap

+0

@cursillosonline sem_postAvaliable设置为5,即我的缓冲区的大小。 sem_posTaken用0初始化,因为缓冲区没有空间。我会检查与pthread_mutex_lock(任何显着差异?) – PlayHardGoPro

回答

3

在很高的层次上,当你做一个sem_post(&sem_posTaken)时,你告诉消费者“你好,你可以消费一些东西”,但此后根据处理器调度器的不同,生产者可能会继续生产,直到信号量计数器不允许他们,所以也许消费者在生产者插入东西之后或者在插入3次之后消费,谁知道?当你试图让一个信号,其计数器为0

如果你想插入和删除之间交替,尝试初始化sem_postAvaliable1的sem_wait线程被阻塞,这样,你会允许只在一个插入首先,因为其他线程会被阻塞在等待sem_post(&sem_postAvaliable),所以只有一个消费者可以使用你插入缓冲区的任何东西,等等,但是请注意,在这种情况下,大小大于1的缓冲区将毫无意义。

+0

所以我的代码是正确的? OMG – PlayHardGoPro

+1

当然,至少我在代码的这一部分没有看到任何错误。 – OiciTrap

+0

我认为,它几乎每次都会填满整个缓冲区并清空整个缓冲区,这是一个迹象表明出现了问题; P谢谢 – PlayHardGoPro