与空指针比较时,C ++ 11 std :: compare_exchange_strong无法编译

时间:2013-11-22 14:00:30

标签: multithreading c++11 parallel-processing atomic compare-and-swap

我正在使用并行avl树并遇到了问题。以下是导致此问题的函数:

template<typename T, int Threads>
bool PTreeSet<T, Threads>::tryInsert(Node* parent, Node* node) {
    if (parent->key > node->key) {
        return parent->left.compare_exchange_strong(nullptr, node); // <-- Error
    } else if (parent->key < node->key) {
        return parent->right.compare_exchange_strong(nullptr, node); // <-- Error
    } else {
        return false;
    }
    return true;
}

parent->left的类型为atomic<Node*>,如果当前值为null,我想将指针设置为node。编译器抱怨错误

error: no matching member function for call to 'compare_exchange_strong'
        return parent->left.compare_exchange_strong(nullptr, node);

为什么这不是有效的代码?

1 个答案:

答案 0 :(得分:2)

atomic<T>::compare_exhange_strong的第一个参数是T&。它需要一个左值。这是“交换”的一半:原子的当前值被加载到第一个参数引用的对象中。

你需要这样的东西:

Node* tmp = nullptr;
parent->left.compare_exchange_strong(tmp, node);

作为一个副作用,如果parent->left实际上不是NULL,那么你在tmp中获得它的当前值(当然,如果你不需要它,你可以忽略它)。