__sync_bool_compare_and_swap 不工作
__sync_bool_compare_and_swap not working
// created a copy of CNode and added the new value
CNode *copyCNode = new CNode;
//memcpy(c, iNode->mainNode->cNode, sizeof(*(iNode->mainNode->cNode)) );
memcpy(copyCNode, iNode->mainNode->cNode, sizeof(CNode) );
CNode *updated_cnode = inserted(copyCNode, b, index);
std::cout << "temporay CNode created : " << updated_cnode->branch[index]->sNode->value << std::endl;
if(memcmp(copyCNode, iNode->mainNode->cNode, sizeof(CNode)) == 0){
std::cout << "mainNode is not changed " << std::endl ;
}else{
std::cout << "mainNode is changed" << std::endl;
}
bool cas_ret = __sync_bool_compare_and_swap(&iNode->mainNode->cNode, copyCNode, updated_cnode);
std::cout << "return cas_ret : " << cas_ret << std::endl;
if(cas_ret){
std::cout << "New added value " << iNode->mainNode->cNode->branch[index]->sNode->value << std::endl;
return 0; // successfully attached the node
}
else{
return 1;
}
以上代码是我的代码库的一部分。
没有编译错误,代码 运行 没问题。
但是 __sync_bool_compare_and_swap 函数在我的代码中总是 return false。甚至在 CAS 函数调用之前,我就进行了内存比较 (memcpy),它显示两个参数相等,在这种情况下,CAS 应该用第三个参数交换值,但事实并非如此。
copyCNode -> 持有iNode->mainNode->cNode的复制值
updated_cnode -> 持有iNode->mainNode->cNode的更新值(新增分支)
请提出任何解决方案。
谢谢
CAS 操作失败,因为:iNode->mainNode->cNode
≠ copyCNode
。它们的内容相同并不重要。 CAS 操作正在尝试做:
if (iNode->mainNode->cNode == copyCNode) {
iNode->mainNode->cNode = updated_cnode;
return true;
}
return false;
您所验证的只是 *copyCnode
= *iNode->mainNode->cNode
,这不是CAS操作感兴趣的
我找到了解决方案。
我想我不应该为copyNode创建内存。相反,我应该 copyNode = iNode->mainNode->cNode
,其余代码运行良好。
感谢@jxh
// created a copy of CNode and added the new value
CNode *copyCNode = new CNode;
//memcpy(c, iNode->mainNode->cNode, sizeof(*(iNode->mainNode->cNode)) );
memcpy(copyCNode, iNode->mainNode->cNode, sizeof(CNode) );
CNode *updated_cnode = inserted(copyCNode, b, index);
std::cout << "temporay CNode created : " << updated_cnode->branch[index]->sNode->value << std::endl;
if(memcmp(copyCNode, iNode->mainNode->cNode, sizeof(CNode)) == 0){
std::cout << "mainNode is not changed " << std::endl ;
}else{
std::cout << "mainNode is changed" << std::endl;
}
bool cas_ret = __sync_bool_compare_and_swap(&iNode->mainNode->cNode, copyCNode, updated_cnode);
std::cout << "return cas_ret : " << cas_ret << std::endl;
if(cas_ret){
std::cout << "New added value " << iNode->mainNode->cNode->branch[index]->sNode->value << std::endl;
return 0; // successfully attached the node
}
else{
return 1;
}
以上代码是我的代码库的一部分。 没有编译错误,代码 运行 没问题。 但是 __sync_bool_compare_and_swap 函数在我的代码中总是 return false。甚至在 CAS 函数调用之前,我就进行了内存比较 (memcpy),它显示两个参数相等,在这种情况下,CAS 应该用第三个参数交换值,但事实并非如此。
copyCNode -> 持有iNode->mainNode->cNode的复制值
updated_cnode -> 持有iNode->mainNode->cNode的更新值(新增分支)
请提出任何解决方案。 谢谢
CAS 操作失败,因为:iNode->mainNode->cNode
≠ copyCNode
。它们的内容相同并不重要。 CAS 操作正在尝试做:
if (iNode->mainNode->cNode == copyCNode) {
iNode->mainNode->cNode = updated_cnode;
return true;
}
return false;
您所验证的只是 *copyCnode
= *iNode->mainNode->cNode
,这不是CAS操作感兴趣的
我找到了解决方案。
我想我不应该为copyNode创建内存。相反,我应该 copyNode = iNode->mainNode->cNode
,其余代码运行良好。
感谢@jxh