2017-04-22 3 views
1
// 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; 
    } 

Le code ci-dessus fait partie de ma base de code. Il n'y a pas d'erreur de compilation et le code fonctionne correctement. Mais la fonction __sync_bool_compare_and_swap renvoie toujours false dans mon code. Même avant l'appel de la fonction CAS, j'ai fait la comparaison de la mémoire (memcpy) et montré que les deux arguments sont égaux, dans ce cas CAS devrait inverser la valeur avec le troisième argument, mais ce n'est pas le cas.__sync_bool_compare_and_swap ne fonctionne pas

copyCNode -> Contient la valeur de copie de inode-> mainNode-> Nœuds-C

updated_cnode -> Peut contenir la valeur actualisée de inode-> mainNode-> Nœuds-C (Nouvelle branche ajouté)

S'il vous plaît suggérer une Solution. Merci

Répondre

1

L'opération CAS a échoué car: iNode->mainNode->cNodecopyCNode. Peu importe que leur contenu soit identique. L'opération CAS essaie de faire:

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

Tout ce que vous vérifié est que *copyCnode et égaux; *iNode->mainNode->cNode, qui n'est pas ce qui intéresse l'opération CAS.

+0

Merci. Mais si CAS n'est pas intéressé à comparer la valeur comme dans mon cas. Alors comment résoudre ce genre de problème. En tant que iNode-> mainNode-> cNode et copyCNode, les deux sont des pointeurs et, comme d'habitude, les deux ont un emplacement mémoire différent. – Django

0

J'ai obtenu la solution.

Je pense que je ne devrais pas créer la mémoire pour copyNode. Au lieu de cela, je devrais juste copyNode = iNode->mainNode->cNode et le reste du code fonctionne bien.

Merci @jxh