C语言 全局变量在子进程中递增,但在父进程中向下递减

igetnqfo  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(124)

正在处理消费者生产者问题。在测试过程中,我遇到了递减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);       
        }
    
    }

尝试在使用和不使用互斥锁的情况下执行此操作,但没有任何效果

2ledvvac

2ledvvac1#

这个问题听起来像是您只需要一个基本的示例,说明使用循环计数器递增值的生成方和递减值的使用方。
这里有几点需要指出。首先,您使用的是fork(),它创建了一个新进程,而不是一个新线程。这两个进程将不再共享内存,因此您的互斥和信号量函数将不再查看相同的内容。您可能需要查找的是创建pthreads。下面是一个生产者和消费者线程的简单示例。其中生产者递增工作计数器和周期计数器,消费者递减工作计数器。当周期计数器达到10时,两者都停止工作。

#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>

struct work
{
    int cycleCount;
    int workCount;
    sem_t lock;
};

void *producer(void *ptr)
{
    struct work *data = (struct work *)ptr;
    int working = 1;
    while (working)
    {
        sem_wait(&data->lock);
        data->workCount++;
        data->cycleCount++;

        if (data->cycleCount == 10)
        {
            working = 0;
        }
        sem_post(&data->lock);
    }

    return 0;
}

void *consumer(void *ptr)
{
    struct work *data = (struct work *)ptr;
    int working = 1;
    while (working)
    {
        sem_wait(&data->lock);
        data->workCount--;

        if (data->cycleCount == 10 && data->workCount == 0)
        {
            working = 0;
        }
        sem_post(&data->lock);
    }

    return 0;
}

int main()
{
    pthread_t prod;
    pthread_t cons;
    int prodRet = 0;
    int prodCon = 0;

    struct work data;
    sem_init(&data.lock, 0, 1);
    data.cycleCount = 0;
    data.workCount = 0;

    pthread_create(&prod, 0, producer, (void *)&data);
    pthread_create(&cons, 0, consumer, (void *)&data);

    pthread_join(prod, (void *)&prodRet);
    pthread_join(cons, (void *)&prodCon);

    printf("cycleCount: %d  ;  workCount: %d\n", data.cycleCount, data.workCount);
    return 0;
}

这里,我们初始化一个信号量,然后pthread_create两个线程,一个生产者,一个消费者,我们给予它们一个相同的工作结构体作为参数,并且都对工作结构体进行操作,使用锁来同步对工作和周期计数器的访问。

相关问题