преобразовать если / назначить потокобезопасной операции CAS

Я совершенно новичок в использовании инструкций 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?

2

Решение

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 Вот.

2

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

Это именно то, что делает CAS, да. C ++ 11 имеет std::atomic И его compare_exchange_weak а также compare_exchange_strong для этого.

2

ты сделаешь

std::atomic<int> a;

int expected = 0;
return a.compare_exchange_strong(expected, 1);
0

Если вы используете gcc, то, возможно, вы хотите __sync_val_compare_and_swap

type __sync_val_compare_and_swap (type *ptr, type oldval type newval, ...)

«Эти встроенные функции выполняют атомарное сравнение и замену. То есть, если текущее значение * ptr равно oldval, записать newval в * ptr».

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