我正在使用并行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);
为什么这不是有效的代码?
答案 0 :(得分:2)
atomic<T>::compare_exhange_strong
的第一个参数是T&
。它需要一个左值。这是“交换”的一半:原子的当前值被加载到第一个参数引用的对象中。
你需要这样的东西:
Node* tmp = nullptr;
parent->left.compare_exchange_strong(tmp, node);
作为一个副作用,如果parent->left
实际上不是NULL
,那么你在tmp中获得它的当前值(当然,如果你不需要它,你可以忽略它)。