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

这正是 CAS 正在做的事情,是的。C ++ 11 具有std::atomic和它的compare_exchange_weakcompare_exchange_strong为此。

于 2013-04-24T19:36:55.800 回答
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 回答
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 回答