我有一些项目,我有一个生产者线程将事件写入缓冲区,另有一个消费者线程从缓冲区获取事件。我的目标是优化这个东西为单个双核心机达到最大吞吐量。在生产者/消费者多线程环境中优化共享缓冲区
目前,我使用一些简单的无锁环缓冲器(无锁是可能的,因为我只有一个消费者和一个生产者线程,因此指针只是由单个线程更新)。
#define BUF_SIZE 32768
struct buf_t { volatile int writepos; volatile void * buffer[BUF_SIZE];
volatile int readpos;) };
void produce (buf_t *b, void * e) {
int next = (b->writepos+1) % BUF_SIZE;
while (b->readpos == next); // queue is full. wait
b->buffer[b->writepos] = e; b->writepos = next;
}
void * consume (buf_t *b) {
while (b->readpos == b->writepos); // nothing to consume. wait
int next = (b->readpos+1) % BUF_SIZE;
void * res = b->buffer[b->readpos]; b->readpos = next;
return res;
}
buf_t *alloc() {
buf_t *b = (buf_t *)malloc(sizeof(buf_t));
b->writepos = 0; b->readpos = 0; return b;
}
但是,这种实现还不够快,应该进一步优化。我已经尝试了不同的BUF_SIZE
值,并获得了一些加速。另外,我已经在buffer
和readpos
之前移动了writepos
,在buffer
之后确保两个变量都在不同的缓存行上,这也导致了一些速度。
我需要的是加速大约400%。你有什么想法如何使用填充等东西来实现这一点?
“无锁是可能的,因为我只有一个消费者和一个生产者线程” - 如果消费者和生产者线程发生冲突会发生什么? – 2010-05-05 10:53:58
在忙碌中等待多少CPU? – 2010-05-05 10:56:40
@Marcelo Cantos:好点! – 2010-05-05 10:58:24