2010-12-09 6 views
2

ABA 문제를 설명하는 기사 하나를 읽었지만 이해할 수없는 것이 있습니다. 나는 작동하지 않는 소스 코드가 있으며 기사의 예제와 유사하지만 문제를 이해하지 못합니다. head_의 실제 값은 동일하지만 (가) next_ 포인터가"ABA"문제를 이해하는 데 도움이 필요합니다.

가 아니라 어떻게 될 수 있습니다 여기에 기사

http://fara.cs.uni-potsdam.de/~jsg/nucleus/index.php?itemid=6

이 말씀은 무엇입니까? 이 명 구조가 메모리에 같은 지역에

struct node { 
    node *next; 
    data_type data; 
}; 

"head_"및 "현재"점 개체를, 어떻게 다른에 _-> 다음과 전류 -> 다음 포인트를 머리 수 있습니까?

또한 다음과 같이 말합니다 : 마지막 작업 인 foo에 의한 비교 및 ​​교체가 실패했을 때 성공한 것입니다.

그럼 어떻게해야합니까? 같은 주소를로드하고 다시 시도 하시겠습니까? 그 차이점은 무엇입니까?

현재 내 코드에서 나는 비슷한 주소

deleted.compare_exchange_strong(head, 0); 

와 객체에 다른 스레드에 의해 변경 될 수 있지만 변경 한 경우 개체가 아니라 초기화 및 그것의 목적에 CompareAndSwap을 비슷한 상황을 가지고 다음 포인터는 초기화 된 객체에 대한 포인터를 포함하고 무엇이 문제입니까?

미리 감사드립니다.

+0

코드 게시, 실행시 발생하는 상황, 실행시 예상되는 상황을 제안하십시오. 그 블로그 게시물은 길고 말문입니다.:) 동시성 프리미티브를 배우고 싶다면 Curt Schimmel의 Unix Systems for Modern Architect : 대칭형 멀티 프로세싱과 커널 프로그래머 용 캐싱 (http://www.powells.com/biblio?isbn=9780201633382) – sarnold

+0

을 읽는 것이 좋습니다. 나는 나의 코드를 게시하고 설명한다. 그것은 블로그에서와 똑같은 설명이 될 것이고 어쩌면 더 나쁜 것일 것이다. 나의 영어가 충분하지 않기 때문에 :) 내 소스는 거의 동일하고 작동하지 않으므로, 나는 그것을 체크하고 싶다. ABA 문제가 실제로 발생했는지 여부. 책을 가져 주셔서 감사합니다 : 나는 재미있는 것을 찾고있었습니다. 그러나 – ledokol

+0

그것은 나에게 ABA 문제가되지 않는 것 같습니다. 멀티 스레딩 문제가있는 것 같지만, 지금까지 ABA를 이해 한 방식이 아닙니다. –

답변

6

"head_"와 "current"가 메모리의 같은 영역을 가리킴. 어떻게 _-> next와 current-> next가 다른 점을 가리킬 수 있습니까?

그렇지 않습니다. 코드는 pop 메서드가 실행되는 동안 headhead->next이 안정적이어야하지만 CAS는 head에 대해서만 이것을 보장합니다. 자동으로 head->next이 변경되지 않고 변경되지 않는다고 가정합니다. 이것은 거짓입니다. head. 그래서 그것은 무언가를 current->next으로 읽습니다. 나중에는 변경됩니다.

또한 다음과 같이 말합니다 : 마지막 조작, foo에 의한 비교 및 ​​교체가 필요하지 않을 때 SUCCEEDS.

그럼 어떻게해야합니까? 같은 주소를로드하고 다시 시도 하시겠습니까? 그 차이점은 무엇입니까?

예. 이 방법은 아무도 구조물 아래로 손을 뻗칠 때까지 기다려야합니다.

변경된 개체가 잘 초기화되어 있고 다음 포인터에 초기화 된 개체에 대한 포인터가 있으면 문제가 무엇입니까?

수 있습니다. 클래스의 불변성 위반, double frees/memory leaks, 데이터 손실 등

+0

그것은 여전히 ​​나에게 명확하지 않다 : (둘 다 같은 구조체를 가리키고 구조체가 바뀌면 CAS로 반복해도 아무 것도 바뀌지 않을 것이다. head = current, head와 current는 동일하므로 그렇게 할 것이다. 그 이유는 무엇입니까? 그들이 같은 주소를 가졌 으면 같은 물체를 가리 킵니다. 즉, 다음은 같고 다를 수 없습니다. 그래서 조용한 가정이 맞습니다. 내 논리의 실수는 어디에 있습니까? – ledokol

관련 문제