1

我正在研究并行 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*>,我想将该指针设置为。node编译器报错

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

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

4

1 回答 1

2

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

你需要这样的东西:

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

作为副作用, if parent->leftis not in fact NULL,您会在 tmp 中获得其当前值(当然,如果您不需要它,可以忽略它)。

于 2013-11-22T14:06:49.153 回答