c++ - Producer-Consumer 生产者创建 2 个元素 POSIX 信号量

标签 c++ c posix semaphore producer-consumer

3 消费者 2 生产者。读取和写入一个缓冲区。 生产者 A 将 1 个元素推送到缓冲区(长度 N),生产者 B 将 2 个元素推送到缓冲区。没有主动等待。我不能使用 System V 信号量。

生产者 A 的示例代码:

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 有很多麻烦。显然我不能做像

这样的事情
sem_wait(full); sem_wait(full);

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

我可以通过哪些方式解决这个问题?

最佳答案

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

长篇大论: 我可以提供的最简单的同步是使用信号量 fullempty 来表示我已推送到缓冲区的元素数。但是,如果我有一个创建 2 个元素的生产者,那么这种解决方案不适用于 POSIX 信号量。

我的解决方案是一个不同的概念。
流程的概要归结为:

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;
    }
}

我希望这对将来的人有用。

关于c++ - Producer-Consumer 生产者创建 2 个元素 POSIX 信号量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40950357/

相关文章:

c - 查找有关将 Linux 应用程序移植到 Windows 的信息

c - 重复使用客户端TCP套接字进行多个HTTP连接

c++ - 二叉搜索树(插入时如何检查是否内存不足)

c++ - 在 C++ 中包含 C 时出错

c - 搭建shell/BBS服务器推荐书籍

c - 解析以逗号分隔的字符串只能工作一次?

java - Sphinx4 与 Pocketsphinx

python - Python 中符合 POSIX 标准的 glob

c++ - "*ptrInt++"是做什么的?

c++ - 如何将 C++ 程序作为 Simulink block 运行?