__sync_bool_compare_and_swap不起作用

时间:2017-04-22 04:41:02

标签: c multithreading c++11 gcc compare-and-swap

// 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函数在我的代码中总是返回false。甚至在CAS函数调用之前,我进行了内存比较(memcpy)并且显示两个参数都相等,在这种情况下,CAS应该将值与第三个参数交换,但事实并非如此。

copyCNode - &gt;保存iNode-&gt; mainNode-&gt; cNode

的副本值

updated_cnode - &gt;保存iNode-&gt; mainNode-&gt; cNode(已添加新分支)的更新值

请建议任何解决方案。 感谢

2 个答案:

答案 0 :(得分:1)

CAS操作失败,原因是:iNode->mainNode->cNodecopyCNode。它们的内容都是相同的并不重要。 CAS操作正在尝试:

if (iNode->mainNode->cNode == copyCNode) {
    iNode->mainNode->cNode = updated_cnode;
    return true;
}
return false;

您验证的是*copyCnode = *iNode->mainNode->cNode,这不是CAS操作感兴趣的内容。

答案 1 :(得分:0)

我得到了解决方案。

我想我不应该为copyNode创建内存。相反,我应该copyNode = iNode->mainNode->cNode,其余代码运作良好。

谢谢@jxh