2016-12-03 82 views
0

3消费者2生产者。读取和写入一个缓冲区。 生产者A推动1个元素缓冲(长度N),生产者B推动2个元素缓冲。没有主动等待。我不能使用System V信号量。对于A公司生产者 - 消费者生产者创造2个要素POSIX信号灯

示例代码:

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

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

+0

条件变量在我看来是你需要的技术。 –

+0

由于我在这个过程中不能有任何主动等待,这意味着我无法在循环的每次迭代中检查一个条件。如果你有更聪明的东西,我会很感激。 – Aaroneiros

+1

条件变量的重点在于避免主动等待。 –

回答

0

https://gist.github.com/RobPiwowarek/65cb9896c109699c70217ba014b9ed20 这将是我遇到的所有问题的解决方案。

TLDR: 我可以提供的最简单的同步是使用信号量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; 
    } 
} 

我希望这将是有人在将来有用。