6

我想使用原子比较和交换,但不是等于,我只想在内存位置不等于旧值时进行交换。在C中可能吗?

4

2 回答 2

4

这个怎么样:

void compare_and_swap_if_not_equal(word_t const required_non_value, word_t const new_value, word_t* ptr_to_shared_variable) { 
    for (;;) {
        word_t const snapshot_value = *ptr_to_shared_variable;
        if (required_non_value == snapshot_value) {
            break;
            // or (sleep and) 'continue;', if you want to wait for the stored value to be different 
            // -- but you might of course miss a transient change to a different state and back.
        } else { 
            if (compare_and_swap_if_equal(ptr_to_shared_variable, snapshot_value, new_value)) {
                // we know the stored value was different; if this 'theory' still matches reality: swap! done!
                break;
            }
        }
    }
}

未经测试。未编译。使用'const'是因为我喜欢这样:)。'word_t' 是一个类型占位符,我不知道真正的类型应该是什么。而且我不知道在 stdatomic.h 中如何调用“compare_and_swap_if_equal”。

(添加) atomic_compare_exchange_weak() 是票。出于某种原因,它需要一个指向“预期”参数的指针,因此您必须将上面的代码修改为

如果 (atomic_compare_exchange_weak(ptr_to_shared_variable, &snapshot_value, new_value)) ...

“弱”版本应该在上面的代码中工作;虚假地返回“false”只会在循环中增加另一个行程。仍未编译,未经测试;不要在家里依赖这个代码。

于 2012-10-05T23:56:22.817 回答
1

这取决于您的架构,但通常在 C 中不可能做到这一点。

通常,比较和交换是使用从内存中的某个位置原子加载并在内存中的位置与您指定的某个现有值匹配时将值存储到该位置的指令来实现的。

至少在 x86 上,没有规定仅在值不匹配时才执行此加载。也不清楚你为什么想做这样的事情。也许另一种架构会支持这样的东西,但这将取决于架构,而不是可以在 C 中以可移植方式完成的事情。

于 2012-10-05T23:32:52.133 回答