请考虑以下几点:

    int grab_next_target(int* target) {
            do {
                    /* Intention: store current value of *target into old, so as
                       to ensure that old never changes */
                    int old = *target;
                    /* get new value based on old -- note that old is assumed not to change here */
                    int new;
                    if (1 == old) { /* imagine that old is 1 so new is now 20 */
                            new = 20;
                    } else if (2 == old) {
                            new = 300;
                    } else if (3 == old) {
                            new = -20;
                    } else if (4 == old) {
                            new = 400;
                    }
                    /* but the compiler has optimized
                       old to just read from *target, so *target could be
                       changed by another thread to be 4.  The CAS will succeed
                       and now target will hold the wrong value (it will hold 20, instead of 400)  */
            } while (!AO_compare_and_swap(target, old, new));
    }

我需要一种方法将*target读入局部变量,并确保局部变量不会被优化为简单的*target。易变是一个答案吗?

最佳答案

是的,volatile就是这么做的。

int grab_next_target(volatile int *target) {
    ...
    int old = *target; // Guaranteed to access "target" exactly once
    ...
}

关于c - 使用CAS(比较和交换)时,如何确保旧值实际上是旧值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9171645/

10-11 08:21