R
Size: a a a
DF
AF
R
AF
R
AF
AF
AT
static void rwticket_wrlock(rwticket *l)
{
unsigned me = atomic_xadd(&l->u, (1<<16));
unsigned char val = me >> 16;
while (val != l->s.write) cpu_relax();
}
Сначала мы увеличиваем l->s.write с помощью атомарной функции atomic_xadd (побитовыми операциями добиваемся увеличения поля write). Результат увеличения сохраняем в me и получаем далее в val значение того самого write после атомарного инкретемента.l->s.write
условие в цикле не выполняется и мы покидаем lock()lock()
, то она и не должна ничего блокировать.R
lock()
, то она и не должна ничего блокировать.AT
AF
static void rwticket_wrlock(rwticket *l)
{
unsigned me = atomic_xadd(&l->u, (1<<16));
unsigned char val = me >> 16;
while (val != l->s.write) cpu_relax();
}
Сначала мы увеличиваем l->s.write с помощью атомарной функции atomic_xadd (побитовыми операциями добиваемся увеличения поля write). Результат увеличения сохраняем в me и получаем далее в val значение того самого write после атомарного инкретемента.l->s.write
условие в цикле не выполняется и мы покидаем lock()R
AF
AF