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

위의 코드는 내 코드 기반의 일부입니다. 컴파일 오류가없고 코드가 정상적으로 실행 중입니다. 그러나 __sync_bool_compare_and_swap 함수는 항상 내 코드에서 false를 반환합니다. CAS 함수 호출 전에도 메모리 비교 (memcpy)를 수행하고 두 인수가 동일하다는 것을 보여주었습니다.이 경우 CAS는 세 번째 인수로 값을 스왑해야하지만 그렇지 않습니다.__sync_bool_compare_and_swap이 작동하지 않습니다.

copyCNode이 ->이 아이 노드 -> mainNode-> cNode

updated_cnode의 복사 값 보유 -> 아이 노드 -> mainNode-의 업데이트 된 값을 보유>를 cNode는 (새로운 지점 추가)

는 제안하십시오 해결책. 감사합니다.

답변

1

iNode->mainNode->cNodecopyCNode 때문에 CAS 작업에 실패했습니다. 그들의 내용이 모두 동일하다는 것은 중요하지 않습니다. CAS의 작업을 수행하려고 :

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

당신이 확인 모든 *copyCnode & 같음이다; *iNode->mainNode->cNode, 어떤 CAS 작업에 관심이 없습니다.

+0

감사합니다. 그러나 CAS가 내 경우처럼 가치를 비교하는 데 관심이 없다면. 그런 종류의 문제를 해결하는 방법. iNode-> mainNode-> cNode 및 copyCNode 둘 다 포인터이며 평소대로 두 메모리의 위치가 다릅니다. – Django

0

나는 해결책을 얻었다.

copyNode에 대한 메모리를 생성하지 않아야한다고 생각합니다. 대신, 나는 단지 copyNode = iNode->mainNode->cNode이어야하며 나머지 코드는 잘 작동한다.

감사합니다. @jxh

관련 문제