首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Linux c++中使用信号量的生产者和消费者

在Linux c++中使用信号量的生产者和消费者
EN

Stack Overflow用户
提问于 2018-04-12 13:08:23
回答 1查看 650关注 0票数 2

以下是我的代码:

代码语言:javascript
复制
#include ...
sem_t mutex;
sem_t empty;
sem_t full;
int main()
{
    int shmid_arr;
    int shmid_get;
    int shmid_set;
    int *shmaddr = 0;
    int *shm_get_addr;
    int *shm_set_addr;
    shmid_arr = shmget(IPC_PRIVATE, 20 * sizeof(int), IPC_CREAT|0600);
    shmid_get = shmget(IPC_PRIVATE, sizeof(int), IPC_CREAT|0600);
    shmid_set = shmget(IPC_PRIVATE, sizeof(int), IPC_CREAT|0600);
    **shmid_get = 0;
    **shmid_set = 0;
    sem_init(&mutex, 1 , 1 );
    sem_init(&full, 1 , 0 );
    sem_init(&empty, 1 , 20 );
    printf("sem_init\n");
    if(fork() == 0)
    {
        int i = 0;
        while(i<20)
        {
            sem_wait(&empty);
            sem_wait(&mutex);
            shm_set_addr = (int *)shmat(shmid, NULL, 0);
            shmaddr = (int *)shmat(shmid, NULL, 0);
            shmaddr[*shm_set_addr%20] =  i + 1;
            printf("produce %d\n", i+1)
            (* shm_set_addr)++;
            i++;
            shmdt(shmadrr);
            shmdt(shm_set_addr);
            sem_post(&mutex);
            sem_post(&full);
        }
        sleep(10);
        printf("Producer is over\n");
        exit(0);
    }else{
        while(1)
            {
                sem_wait(&full);
                sem_wait(&mutex);
                shm_get_addr = (int *)shmat(shmid, NULL, 0);
                shmaddr = (int *)shmat(shmid, NULL, 0);
                printf("consumer get %d\n",shmaddr[*shm_get_addr%20]);
                (*shm_get_addr)++;
                shmdt(shmadrr);
                shmdt(shm_get_addr);
                sem_post(&mutex);
                sem_post(&empty);
                sleep(1);
            }
        printf("consumer over\n");
        exit(0);
        }
    }
    return 0;
}

我设置了三个信号量,包括fullemptymutexempty初始化为20full初始化为0mutex初始化为1

我把P(empty)放在生产者临界区的前面,把V(full)放在它后面,用P(mutex)m,V(mutex)锁住。我将P(full)放在消费者关键部分的前面,将V(empty)放在它后面,使用P(mutex),V(mutex)进行锁定。我使用shm来设置和获取共享内存。

它应该得到生产者生产和消费者消费的结果。但是我的程序从来没有运行过消费者生产者处理器。这让我很困惑。我是不是用错了信号量?或者我以错误的方式设置了共享内存?

EN

回答 1

Stack Overflow用户

发布于 2018-04-12 16:58:37

有几件事你应该解决。

信号量也必须在共享内存中,所以您必须在父进程中执行以下操作:

代码语言:javascript
复制
mutex_memid = shmget(IPC_PRIVATE, sizeof(sem_t), IPC_CREAT|0600);

然后在父进程和子进程中shmat它们。

代码语言:javascript
复制
mutex = (sem_t *)shmat(mutex_memid, NULL, 0);

您不需要在每次使用共享内存时都附加和分离它,所以您可以在while循环之前执行shmat,并在使用完共享内存后执行shmdt (在循环之外)。

您不需要存储shm_get_addrshm_set_addr,因为在示例中这两个进程都没有使用这些变量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49788414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档