Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
function T_InterlockedQueue.PopAll: I_IntrefaceEnumerator; var head: PInterlockedQueueItem; begin head := RevertSList(PInterlockedQueueItem(InterlockedFlushSList(FHeader))); Result := T_InterfaceEnumerator.Create(head); end; procedure T_InterlockedQueue.Push(const AItem: IInterface); var listItem: PInterlockedQueueItem; begin listItem := GetMemory(sizeof(T_InterlockedQueueItem)); ZeroMemory(listItem, sizeof(T_InterlockedQueueItem)); listItem.Data := AItem; InterlockedPushEntrySList(FHeader, PSLIST_ENTRY(listItem)); end;
template<class TYPE>
void LockFreeQueue2<TYPE>::Enqueue(TYPE* data)
{
...
if (writerTop) // Если очередь Писателя уже существует, добавляем елемент в ее конец
{
// Здесь сейчас первый поток
writerBottom->next = data;
writerBottom = data;
}
...
}
template<class TYPE>
bool LockFreeQueue2<TYPE>::Dequeue(volatile TYPE*& data)
{
...
if (isWriterFinished && writerTop) // Проверяем Писетельскую очередь, если он закончил свою работу
{
readerTop = writerTop;
// Здесь сейчас второй поток
writerTop = NULL;
}
}
template<class TYPE>
bool LockFreeQueue2<TYPE>::Flush()
{
...
if (!readerTop) // Проверяем можно ли сбросить Читателю свой остаток
{
// Здесь сейчас третий поток
readerTop = writerTop;
return true;
}
}
Неблокируемая очередь сообщений для двух потоков