首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生产者-消费者生产者创建2个元素POSIX信号量

生产者-消费者生产者创建2个元素POSIX信号量
EN

Stack Overflow用户
提问于 2016-12-04 01:13:26
回答 1查看 274关注 0票数 0

3个消费者2个生产者。对一个缓冲区进行读写操作。生产者A将1个元素推送到buffer (长度N),而生产者B正在将2个元素推送到buffer。无活动等待。我不能使用System V信号量。

生产者A的示例代码:

代码语言:javascript
复制
void producerA(){
  while(1){
    sem_wait(full);
    sem_wait(mutex);

    Data * newData = (Data*) malloc(sizeof(Data));
    newData->val = generateRandomletter();
    newData->A = false;
    newData->B = false;
    newData->C = false;

    *((Data*) mem+tail) = *newData;

    ++elements;
    tail = (tail + 1) % N;

    sem_post(mutex); 
    sem_post(empty);
  }
}

消费者看起来很相似,除了他们阅读或消费,但这是不相关的。我和制片人B有很多麻烦。显然我不能做像这样的事情。

代码语言:javascript
复制
sem_wait(full); sem_wait(full);

我还尝试为生产者B设置一个不同的信号量,当缓冲区中有2个或更多空闲点时,该信号量会被提升。但这并没有起作用,因为我仍然需要适当地降低和增加信号量fullempty

我可以用什么方法来解决这个问题?

EN

回答 1

Stack Overflow用户

发布于 2016-12-05 05:55:10

https://gist.github.com/RobPiwowarek/65cb9896c109699c70217ba014b9ed20,这将是我整个问题的解决方案。

我能提供的最简单的同步是使用信号量、fullempty来表示我推入缓冲区的元素数量。但是,如果我有一个生产者来创建2个元素,那么这种解决方案就不适用于POSIX信号量。

我的解决方案是一个不同的概念。

流程的概要可以归结为:

代码语言:javascript
复制
while(1){  
    down(mutex);
    size = get size
    if (condition related to size based on what process this is)
    {
         do your job;
         updateSize(int diff); // this can up() specific semaphores 
                               // based on size
                               // each process has his own semaphore
         up(mutex);
    }
    else 
    {
         up(mutex);
         down(process's own semaphore);
         continue;
    }
}

我希望这将在未来对某些人有用。

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

https://stackoverflow.com/questions/40950357

复制
相关文章

相似问题

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