2013-04-24 2 views
2

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

Подробнее о станде :: атомного here.

2

Это как раз то, что делает CAS, да. C++ 11 имеет std::atomic и его compare_exchange_weak и compare_exchange_strong.

0

вы

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 «.