c++ - 将 if/assign 转换为线程安全的 CAS 操作

标签 c++ lock-free

我在使用 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 的更多信息 here .

关于c++ - 将 if/assign 转换为线程安全的 CAS 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16200685/

相关文章:

c++ - 如何将比较对象或函数传递给类函数

c++ - 插入 C++ 映射 STL 容器失败

c++ - 简单的无锁 MPSC 环形缓冲区的问题

d - 无锁固定大小队列失败

c++ - C: 无锁内存分配库

c++ - rsa_public_encrypt 返回-1,错误0x0406B07A

c++ - 为什么在 std::optional 的某些实现中存在虚拟 union 成员?

c++ - 能否将位置属性存储在除 0 之外的属性号中

c++ - 为什么具有顺序一致性的std::atomic存储区使用XCHG?

c++ - 原子操作需要硬件支持吗?