2

私は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か?

4

4 に答える 4

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 の詳細については、こちらを参照してください

于 2013-04-24T19:40:27.250 に答える
2

それがまさに CAS が行っていることです。C++11 にはstd::atomic、そのための機能がcompare_exchange_weakありcompare_exchange_strongます。

于 2013-04-24T19:36:55.800 に答える
0

あなたがやる

std::atomic<int> a;

int expected = 0;
return a.compare_exchange_strong(expected, 1);
于 2013-04-24T19:40:01.830 に答える
0

gcc を使用している場合は、おそらく__sync_val_compare_and_swapが必要です

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

「これらのビルトインは、アトミックな比較とスワップを実行します。つまり、*ptr の現在の値が oldval の場合、newval を *ptr に書き込みます。」

于 2013-04-24T19:47:05.373 に答える