Атомная функция без блокировок для изменения двух независимых областей памяти

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

Возможно ли теоретически реализовать эту функцию атомарно без блокировки, поскольку она изменяет две независимые ячейки памяти entryLookup[id] а также entry?

   void updateEntry(Entry ** entryLookup, unsigned int id, int val1, short val2){
            Entry * entry     = entryLookup[id];
            entry->val1       = val1;
            entry->val2       = val2;
            entryLookup[id]  += sizeof(Entry);
   }

1 ответ

Решение

Чтобы сделать этот потокобезопасным, вы можете увеличить entryLookup[id] сначала убедитесь, что любой другой поток, который появится позже, не может изменить ту же запись, а затем заполните значения. Атомное дополнение необходимо, когда возвращается старое значение:

void updateEntry(Entry ** entryLookup, unsigned int id, int val1, short val2)
{
    Entry * entry = __sync_fetch_and_add(&entryLookup[id], sizeof(Entry));
    entry->val1   = val1;
    entry->val2   = val2;
}
Другие вопросы по тегам