Цитата(Yaumen @ Nov 5 2009, 15:32)

Есть ли решение в этой ситуации или надо полностью менять подход при работе с очередью?
Очереди (направленные очереди если быть точнее) можно организовать так, что запрет прерываний непотребуется.
Для этого необходимо и достаточно чтобы к очереди доступ имели не более двух потоков, один строго пишет, второй строго читает. Как раз Ваш случай.
Код
typedef struct tagQUEUE
{
volatile int put;
volatile int get;
int cnt;
PVOID *pStorage;
} TQUEUE, *PQUEUE;
void queue_define( PQUEUE pq, PVOID storage, int storage_size)
{
pq->cnt = storage_size / sizeof( PVOID );
pq->put = pq->get = 0;
pq->pStorage = storage;
}
PVOID queue_read( PQUEUE pq )
{
PVOID retval = NULL;
if (pq->get != pq->put)
{ // got smth to read
int new_index = pq->get + 1;
if (new_index >= pq->cnt)
new_index = 0;
retval = pq->pStorage[ pq->get ];
pq->get = new_index;
}
return retval;
}
void queue_write( PQUEUE pq, PVOID msg )
{
int new_index = pq->put + 1;
if (new_index >= pq->cnt)
new_index = 0;
pq->pStorage[ pq->put ] = msg; // <-- эта операция защищена, т.к. индекс put еще не изменился, функция чтения не знает о наличии новой записи
pq->put = new_index; // <-- здесь требуется атомарная модификация индекса, т.е. чтобы переменная put записалась одной асм командой (отсюда переменная put не может быть разрядностью больше чем разрядность регистров процессора).
}