使用生产者和消费者,C 中的信号量
Working with Producer and Consumer, sempahore in C
我正在尝试制作生产者/消费者应用程序。问题是,我的生产者正在填充整个缓冲区,然后消费者正在删除整个缓冲区......消费者不应该在生产者对信号量发出 post
后立即从缓冲区中删除一个项目吗?
我的代码:
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
是一个全局整数,用于计算消费者从缓冲区中消费某项的次数。
在非常高的级别上,当您执行 sem_post(&sem_posTaken)
时,您是在告诉消费者 "Hey!, you can consume something",但在那之后,根据处理器调度程序,生产者可能会继续生产,直到信号量的计数器不允许他们,所以也许消费者在生产者插入东西后立即消费,或者可能在 3 次插入后消费,谁知道呢?当您尝试创建计数器为 0 的信号量的 sem_wait 时,线程被阻塞。
如果您想在插入和删除之间交替,请尝试将 sem_postAvaliable
初始化为 1
,这样一开始您将只允许一次插入,因为其他线程将被阻塞等待a sem_post(&sem_postAvaliable)
,那么只有一个消费者可以消费你在缓冲区中插入的任何内容,依此类推,但请注意,在这种情况下,大小大于 1 的缓冲区将毫无意义。
我正在尝试制作生产者/消费者应用程序。问题是,我的生产者正在填充整个缓冲区,然后消费者正在删除整个缓冲区......消费者不应该在生产者对信号量发出 post
后立即从缓冲区中删除一个项目吗?
我的代码:
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
是一个全局整数,用于计算消费者从缓冲区中消费某项的次数。
在非常高的级别上,当您执行 sem_post(&sem_posTaken)
时,您是在告诉消费者 "Hey!, you can consume something",但在那之后,根据处理器调度程序,生产者可能会继续生产,直到信号量的计数器不允许他们,所以也许消费者在生产者插入东西后立即消费,或者可能在 3 次插入后消费,谁知道呢?当您尝试创建计数器为 0 的信号量的 sem_wait 时,线程被阻塞。
如果您想在插入和删除之间交替,请尝试将 sem_postAvaliable
初始化为 1
,这样一开始您将只允许一次插入,因为其他线程将被阻塞等待a sem_post(&sem_postAvaliable)
,那么只有一个消费者可以消费你在缓冲区中插入的任何内容,依此类推,但请注意,在这种情况下,大小大于 1 的缓冲区将毫无意义。