2011-05-16 5 views
1

자물쇠가없는 데이터 구조로 작업 중이며 CAS 포인터를 사용하려고합니다.__sync_bool_compare_and_swap 컴파일러 플래그 및 포함

비교 및 ​​스왑을 사용할 때 컴파일러에 어떤 플래그를 전달해야합니까? http://locklessinc.com/ 메모리 할당 자에 대한 라이센스를 받았습니다. netbeans도 사용 중입니다.

현재 유일한 플래그는 링커 -march = native -lllalloc입니다.

그러나 프로그램을 실행할 때 이상한 메모리 문제가 발생합니다. 나는 깃발이나 두 개가 누락되었을 수 있다고 생각합니다 ... 또한 netbeans는 "식별자 __sync_bool_compare_and_swap을 (를) 확인할 수 없습니다"라고 말했지만 여전히 컴파일합니다.

누구든지 아이디어가 있습니까?

데이터 구조 :

struct Ambigous 
{ 
    short type; 
    union{ 
     struct{ 
      bool inCleanup; 
      KEY key; 
      VALUE value; 
     }; 
     Ambigous* volatile list[MAIN_SIZE];//CHANGED ordering, still have netbeans error 
    }; 

}; 

비교 내 스왑 코드 I 메모리 할당 방법

bool res= __sync_bool_compare_and_swap(&(local->list[pos]), current_node, new_node); 

:

Ambigous *temp_spine = (Ambigous *) calloc(1,sizeof (Ambigous)); 
+1

빠른 질문입니다. 왜 '목록'은 '휘발성'으로 선언됩니까? 생성 된 어셈블러를 살펴 보았습니까? –

+0

아, 그게 내 문제일지도 몰라 목록이 휘발성이어서는 안되며, 목록 안의 각 요소는 휘발성이어야합니다. –

+1

아니요. 왜 '휘발성'입니까? 어떤 서비스를 제공합니까? –

답변

2

__sync_bool_compare_and_swap는 GCC 고유입니다. 특정 컴파일러 플래그가 필요 없습니다. 그러나 IDE에는 정의가 없으므로 정의를 찾을 수 없습니다. 그리고 다른 컴파일러에서는 작동하지 않을 수도 있습니다. 예 : Visual Studio 컴파일러가이를 호출합니다. InterlockedCompareExchange

문제가있는 부분은 나머지 코드를 보지 않고 말하기 어렵습니다. 잠금이없는 알고리즘은 매우 까다 롭습니다. 작은 경쟁 조건을 놓치는 것은 너무 쉽습니다. 달리 할 아주 좋은 이유가 없다면 자물쇠에 달라 붙어 라.

+0

나는 연구 중이며, 메모리 오류는 알고리즘에 없다. 비교와 스왑 또는 메모리 할당 자 중 하나 일 것이다. 알고리즘을 알지 못하는 이유는 메모리 검사가 Null 검사 후에 null 예외가되고 테스트중인 알고리즘의 일부가 삽입 된 값을 제거하지 않기 때문입니다. –

+0

값을 삭제하지 않았기 때문입니다. 당신이 삽입 이전이나 뭔가 이전의 부실한 NULL 읽기를 보지 못했다는 뜻은 아닙니다. 다시 말하지만, 완전한 코드 없이는 이것을 더 이상 디버깅 할 수 없습니다. – bdonlan

+1

당신은 그들이 매우 까다 롭습니다. 내가 예상 한 위치는 null이되지 않을 것이며, 예상하지 못한 크기 조정 프로세스를 수행하는 null이되었습니다. 난 실수로 같은 데이터 파일을 가진 모든 스레드를 실행하기 때문에 버그를 발견 :. –

관련 문제