为什么在生产者/消费者问题中改变信号量的顺序很重要?

问题描述

所以我知道如何编码生产者/消费者问题,但是我不知道为什么它起作用以及为什么重新排列代码使其不起作用。

int sizeOfBuffer = 1000;
sem_t full;
sem_t empty;
sem_t sem;
std::vector<int> buffer;
sem_init(full,1,0);
sem_init(empty,sizeOfBuffer);
sem_init(sem,1); 
void producer()
{
    While (true) {
        sem_wait(empty);
        sem_wait(sem);
        buffer->push_back(1);    // add to the buffer
        sem_post(sem);
        sem_post(full);
    }
}
void consumer()
{
    While (true) {
        sem_wait(full);
        sem_wait(sem);
        buffer->pop_back;        // take away from the buffer
        sem_post(sem);
        sem_post(empty);
    }
}

因此上面的代码有效。即使我使用的是std :: vector缓冲区而不是数组缓冲区,也没有死锁并且运行速度非常快。内存的关键部分是缓冲区,它被称为sem的信号量保护。

但是,下面的代码不起作用。唯一的变化是sem_wait()和sem_post()的执行顺序。但这导致了僵局,我只是不明白为什么。关键部分应该仍然是相似的,但是空和完整的信号量以及std :: vector现在都非常关键。

int sizeOfBuffer = 1000;
sem_t full;
sem_t empty;
sem_t sem;
std::vector<int> buffer;
sem_init(full,1);  
void producer()
{
    While (true) {
        sem_wait(sem);
        sem_wait(empty);
        buffer->push_back(1);    // add to the buffer
        sem_post(full);
        sem_post(sem);
    }
}
void consumer()
{
    While (true) {
        sem_wait(sem);
        sem_wait(full);
        buffer->pop_back;        // take away from the buffer
        sem_post(empty);
        sem_post(sem);
    }
}

那么为什么信号量的顺序很重要,为什么第二个代码不起作用? 我想我需要像我五岁时那样向我解释这一点,因为我的朋友试图向我解释这一点,我只是有点理解这是有区别的,其中一个导致了僵局,而另一个导致了完美运行很好。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)