我正在一个并行的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);为什么这是无效代码?
发布于 2013-11-22 14:06:49
atomic<T>::compare_exhange_strong的第一个参数是T&。它需要一个值。这是“exchange”的一半:原子的当前值被加载到第一个参数所引用的对象中。
你需要这样的东西:
Node* tmp = nullptr;
parent->left.compare_exchange_strong(tmp, node);副作用是,如果parent->left实际上不是NULL,则在tmp中得到它的当前值(当然,如果您不需要它,可以忽略它)。
https://stackoverflow.com/questions/20146682
复制相似问题