为什么我的 C 语言生产者-消费者程序不能正常工作?
Why my producer-consumer program in C not working properly?
我正在尝试同步 02 个子进程,它们使用大小为 5 的缓冲区进行通信,仅使用信号量“空”和“满”。
进程 01 执行 producer() 函数,第二个进程执行 consumer(),但是消费者函数根本不执行,即使生产者是阻塞(空=0)。
5 次迭代后,我只得到 5 次插入但没有消耗(我现在插入 5 次)。另外我相信不需要互斥锁,因为只有 01 个生产者和 01 个消费者,对吧?这是02函数和主程序:
#include <semaphore.h>
#include <stdlib.h>
#include <stdio.h>
#include<unistd.h>
#include<sys/wait.h>
#include <pthread.h>
#define MaxItems 5
#define BufferSize 5
sem_t empty;
sem_t full;
//pthread_mutex_t lock;
int in = 0;
int out = 0;
int buffer[BufferSize];
int N = 20;
void *producer()
{
while(1)
{
//pthread_mutex_lock(&lock);
sem_wait(&empty);
buffer[in] = 5; // fill the buffer with numbers
printf("\nInsert Item %d at %d\n", buffer[in],in);
int emptyvalue, fullValue;
sem_getvalue(&full, &fullValue); sem_getvalue(&empty, &emptyvalue);
printf("full is:%d, empty is:%d\n", fullValue, emptyvalue);
//pthread_mutex_unlock(&lock);
sem_post(&full); // increase the value of full, so the consumer should execute now?
in = (in+1)%BufferSize;
usleep(500000);
}
}
void *consumer()
{
printf("test: consumer"); //this consumer function does not execute
while (1)
{
sem_wait(&full); // full initially is = 0, so it blocks at first
//pthread_mutex_lock(&lock);
int item = buffer[out];
printf("Remove Item %d from %d\n",item, out);
//pthread_mutex_unlock(&lock);
sem_post(&empty);
printf(" %d", out); //using the values in the buffer
out = (out+1)%BufferSize;
}
}
int main()
{
//pthread_mutex_init(&lock, NULL);
sem_init(&empty,0,BufferSize);
sem_init(&full,0,0);
pid_t id1, id2;
id1 = fork();
if (id1 == 0) {
id2 = fork();
if (id2 == 0) //child 2
{
printf("im the consumer");
consumer();
}else{ //child 1
printf("i'm the producer");
producer();
}
}else{
sem_destroy(&full);
sem_destroy(&empty);
//pthread_mutex_destroy(&lock);
return 0;
}
}
非常感谢
默认情况下,不同的进程位于不同的虚拟地址空间中。他们无法访问彼此的记忆。 POSIX 信号量也是如此。这意味着当您使用 fork
进行两个过程时,您最终会得到两组不同的变量。每个进程都有单独的 buffer
和信号量。
要使这项工作正常进行,您应该创建一个内存映射(mmap
对应 POSIX),在其中放置您需要在进程之间共享的所有数据,包括信号量。信号量应使用 pshared
初始化为非零。 sem_init
的手册页对此有更多详细信息。
或者,您可以使用其他形式的进程间通信,例如管道。
我正在尝试同步 02 个子进程,它们使用大小为 5 的缓冲区进行通信,仅使用信号量“空”和“满”。 进程 01 执行 producer() 函数,第二个进程执行 consumer(),但是消费者函数根本不执行,即使生产者是阻塞(空=0)。 5 次迭代后,我只得到 5 次插入但没有消耗(我现在插入 5 次)。另外我相信不需要互斥锁,因为只有 01 个生产者和 01 个消费者,对吧?这是02函数和主程序:
#include <semaphore.h>
#include <stdlib.h>
#include <stdio.h>
#include<unistd.h>
#include<sys/wait.h>
#include <pthread.h>
#define MaxItems 5
#define BufferSize 5
sem_t empty;
sem_t full;
//pthread_mutex_t lock;
int in = 0;
int out = 0;
int buffer[BufferSize];
int N = 20;
void *producer()
{
while(1)
{
//pthread_mutex_lock(&lock);
sem_wait(&empty);
buffer[in] = 5; // fill the buffer with numbers
printf("\nInsert Item %d at %d\n", buffer[in],in);
int emptyvalue, fullValue;
sem_getvalue(&full, &fullValue); sem_getvalue(&empty, &emptyvalue);
printf("full is:%d, empty is:%d\n", fullValue, emptyvalue);
//pthread_mutex_unlock(&lock);
sem_post(&full); // increase the value of full, so the consumer should execute now?
in = (in+1)%BufferSize;
usleep(500000);
}
}
void *consumer()
{
printf("test: consumer"); //this consumer function does not execute
while (1)
{
sem_wait(&full); // full initially is = 0, so it blocks at first
//pthread_mutex_lock(&lock);
int item = buffer[out];
printf("Remove Item %d from %d\n",item, out);
//pthread_mutex_unlock(&lock);
sem_post(&empty);
printf(" %d", out); //using the values in the buffer
out = (out+1)%BufferSize;
}
}
int main()
{
//pthread_mutex_init(&lock, NULL);
sem_init(&empty,0,BufferSize);
sem_init(&full,0,0);
pid_t id1, id2;
id1 = fork();
if (id1 == 0) {
id2 = fork();
if (id2 == 0) //child 2
{
printf("im the consumer");
consumer();
}else{ //child 1
printf("i'm the producer");
producer();
}
}else{
sem_destroy(&full);
sem_destroy(&empty);
//pthread_mutex_destroy(&lock);
return 0;
}
}
非常感谢
默认情况下,不同的进程位于不同的虚拟地址空间中。他们无法访问彼此的记忆。 POSIX 信号量也是如此。这意味着当您使用 fork
进行两个过程时,您最终会得到两组不同的变量。每个进程都有单独的 buffer
和信号量。
要使这项工作正常进行,您应该创建一个内存映射(mmap
对应 POSIX),在其中放置您需要在进程之间共享的所有数据,包括信号量。信号量应使用 pshared
初始化为非零。 sem_init
的手册页对此有更多详细信息。
或者,您可以使用其他形式的进程间通信,例如管道。