Я совершенно новичок в использовании инструкций CAS, поэтому прошу прощения за ответ на такой простой вопрос, но я должен понимать основные вещи
Так, если возможно преобразовать этот код в некоторую инструкцию CAS, чтобы сделать этот поток кода безопасным?
if (a == 0) {
a = 1;
return true;
} else {
return false;
}
В реальной жизни этот код выглядит так:
// 0 - available, 1 - processing, 2 - ready
uint16_t status[QUEUE_LENGTH];
bool MsgQueue::Lock(uint32_t msgSeqNum)
{
if (status[msgSeqNum] == 0) {
status[msgSeqNum] = 1;
return true;
} else {
return false;
}
}
Я бы предпочел портативные решения (которые могут работать как на Windows, так и на Linux), вероятно, мне следует использовать std::atomic
?
std::atomic<uint16_t> status[QUEUE_LENGTH];
bool MsgQueue::Lock(uint32_t msgSeqNum)
{
uint16_t expected = 0;
return status[msgSeqNum].compare_exchange_strong(expected, 1);
}
Подробнее о std :: atomic Вот.
Это именно то, что делает CAS, да. C ++ 11 имеет std::atomic
И его compare_exchange_weak
а также compare_exchange_strong
для этого.
ты сделаешь
std::atomic<int> a;
int expected = 0;
return a.compare_exchange_strong(expected, 1);
Если вы используете gcc, то, возможно, вы хотите __sync_val_compare_and_swap
type __sync_val_compare_and_swap (type *ptr, type oldval type newval, ...)
«Эти встроенные функции выполняют атомарное сравнение и замену. То есть, если текущее значение * ptr равно oldval, записать newval в * ptr».