我有生產者消費者問題需要稍加修改解決 - 有許多並行生產者,但只有一個消費者在一個並行線程。當製片人沒有放置緩衝區時,它就會忽略元素(不等待消費者)。我有一些C編寫的僞代碼:幾乎無鎖生產者消費者
struct Element
{
ULONG content;
volatile LONG bNew;
}
ULONG max_count = 10;
Element buffer* = calloc(max_count, sizeof(Element));
volatile LONG producer_idx = 0;
LONG consumer_idx = 0;
EVENT NotEmpty;
BOOLEAN produce(ULONG content)
{
LONG idx = InterlockedIncrement(&consumer_idx) % max_count;
if(buffer[idx].bNew)
return FALSE;
buffer[idx].content = content;
buffer[idx].bNew = TRUE;
SetEvent(NotEmpty);
return TRUE;
}
void consume_thread()
{
while(TRUE)
{
Wait(NotEmpty);
while(buffer[consumer_idx].bNew)
{
ULONG content = buffer[consumer_idx].content;
InterlockedExchange(&buffer[consumer_idx].bNew, FALSE);
//Simple mechanism for preventing producer_idx overflow
LONG tmp = producer_idx;
InterlockedCompareExchange(&producer_idx, tmp%maxcount, tmp);
consumer_idx = (consumer_idx+1)%max_count;
doSth(content);
}
}
}
我不是100%確定這段代碼是正確的。你能看到可能發生的任何問題嗎?或者,也許這個代碼可以寫得更好?
我使用全局變量和原子操作執行無鎖同步。這是出於性能原因。 – rnd 2011-12-27 11:10:34
恩......實際上你只有增量安全。你仍然有緩衝[i] .b新的髒讀。在我看來,使用單個信號量是一個更好的主意,而不是將生產者分配給數組中的單個位置索引 – SOReader 2011-12-27 12:16:53