【发布时间】:2019-07-25 16:07:53
【问题描述】:
我有一个不能锁定或分配内存的消费者线程和一个可以的生产者线程。 我想实现一个两个位置的循环缓冲区,以便能够从生产者向消费者线程提供数据,并且每当没有新数据可供消费时,消费者只会重新使用已经可用的数据。
这是我现在想出的:
bool newDataAvailable = false;
bool bufferEmpty = true;
foo* currentData = new foo();
foo* newData = new foo();
void consumer() {
while(true) {
currentData->doSomething();
if(newDataAvailable) {
foo* tmp = currentData;
// Objects are swapped so the old one can be reused without additional allocations
currentData = newData;
newData = tmp;
newDataAvailable = false;
bufferEmpty = true;
}
}
}
void producer() {
while(true) {
while(!bufferEmpty) { wait(); }
newData->init();
bufferEmpty = false;
newDataAvailable = true;
}
}
这种幼稚的实现可以吗?我知道读取和写入变量可以是非原子的,所以我应该使用原子存储,但那些会导致锁。这里需要使用原子存储吗?
另外,我想消除生产者中的主动等待,我想我可以使用std::condition_variable,但它们需要使用互斥锁,我买不起。
【问题讨论】:
标签: c++ atomic producer-consumer circular-buffer lockless