正在处理消费者生产者问题。在测试过程中,我遇到了递减globar变量buffcount1的问题,我抛出了一个print语句,以查看父循环是否正常工作,它确实正常工作,但问题是值不递减
int pid = fork();
if(pid == 0){
close(fds[0]);
while(1){
if(buffcount1 != MAX){
sem_wait(&empty);
pthread_mutex_lock(&lock1);
write(fds[1], &count2, sizeof(count2));
count1++;
buffcount1++;
pthread_mutex_unlock(&lock1);
usleep(((rand() % 5) + 1) * 10000);
printf("count1: %d\t buffcount1: %d\n", count1, buffcount1);
sem_post(&full);
}
}
} else{
while(1){
pthread_mutex_lock(&lock1);
buffcount1--;
pthread_mutex_unlock(&lock1);
usleep(((rand() % 5) + 1) * 20000);
}
}
尝试在使用和不使用互斥锁的情况下执行此操作,但没有任何效果
1条答案
按热度按时间2ledvvac1#
这个问题听起来像是您只需要一个基本的示例,说明使用循环计数器递增值的生成方和递减值的使用方。
这里有几点需要指出。首先,您使用的是
fork()
,它创建了一个新进程,而不是一个新线程。这两个进程将不再共享内存,因此您的互斥和信号量函数将不再查看相同的内容。您可能需要查找的是创建pthreads。下面是一个生产者和消费者线程的简单示例。其中生产者递增工作计数器和周期计数器,消费者递减工作计数器。当周期计数器达到10时,两者都停止工作。这里,我们初始化一个信号量,然后
pthread_create
两个线程,一个生产者,一个消费者,我们给予它们一个相同的工作结构体作为参数,并且都对工作结构体进行操作,使用锁来同步对工作和周期计数器的访问。