Атомная функция без блокировок для изменения двух независимых областей памяти
У меня есть следующая функция называется 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;
}