Спинлок в очереди

Я случайно наткнулся на очередь Spinlock и хотел бы реализовать в C ++. Я немного погуглил для информации об этом, но не смог получить надлежащую документацию.

Любая документация / советы по внедрению будет высоко ценится.

заранее спасибо

У меня есть следующие сомнения в коде, указанном Майклом Брауном

// represents processor in wait queue of the spinlock
struct qsl_entry
{

// next processor in the queue that is waiting to enter section
qsl_entry* next;

// indicates whether the access to section has been granted to processor
int state;

};

// queued spinlock
struct qsl
{

// the first processor in the queue that is waiting to enter section
qsl_entry* head;

};

// requests access to critical section guarded by the spinlock,
// if the section is already taken it puts processor to wait
// and insert it into queue
// lck - queued lock that used to guard section
// ent - entry that represent processor in queue of the spinlock
void lock_qsl(qsl* lck, qsl_entry* ent)
{
__asm
{
mov eax, ent;
mov ebx, lck;

// prepare queue entry
mov [eax], 0;
mov edx, eax;
mov [eax]qsl_entry.state, 1;

// store it as the last entry of the queue -- Is this what is line is doing ?
// ebx contains address of lck & [ ebx ] refers to address pointed by lck &
// it is over written to ent. eax now contains the memory the lck was pointing to.
lock xchg [ebx],eax;

// if the section available grant access to processor?
test eax, eax;
jz enter_section;
// link new entry with the rest of queue -- really ? are we nt overwritting
// the next pointer here ?
mov [eax],edx

// wait for processor's turn
wait1:
pause;
cmp [edx]qsl_entry.state, 1;
je wait1;

enter_section:
}
}

Является ли эта реализация даже правильной? Я сомневаюсь в этом!

1

Решение

Автор рассматриваемого кода здесь. Сначала позвольте мне указать код верно. Я просто написал более подробное объяснение кода здесь: http://kataklinger.com/index.php/queued-spinlocks/

Также у меня есть другая реализация, которая несколько проще, но не так хороша, как эта (тем не менее, правильная). Я посмотрю, смогу ли я найти это где-нибудь. Я нашел это. Вот ссылка на обсуждение, которое включает в себя обе реализации: http://forum.osdev.org/viewtopic.php?f=15&т = 15389

В последнем посте также есть ссылка, которая обсуждает очереди спин-блокировки в большей глубине: http://www.cs.rice.edu/~johnmc/papers/tocs91.pdf

Да, я немного опоздал на вечеринку, но я был этим постом всего несколько дней назад, и это вдохновило меня написать лучшее объяснение кода.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]