制作人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个或更多的空闲点时被提升。但这并没有成功,因为我仍然需要适当降低和增加信号量full
和empty
。
我可以在哪些方面解决这个问题?
答案 0 :(得分:1)
https://gist.github.com/RobPiwowarek/65cb9896c109699c70217ba014b9ed20 这将解决我遇到的整个问题。
TLDR:
我可以提供的最简单的同步是使用信号量empty
和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;
}
}
来表示我已经推送到缓冲区的元素数量。但是,如果我有一个创建2个元素的生产者,那么这种解决方案对POSIX信号量不起作用。
我的解决方案是一个不同的概念 流程概述归结为:
class FooConcrete {
getImpl : () => number;
constructor(getImpl: () => number) {
this.getImpl = getImpl;
}
get() : number {
return this.getImpl();
}
}
我希望将来对某人有用。