2010-08-16 3 views
6

좋아, 나는 이것을 알아 내기 위해 모든 방법을 시도해왔다.얼랭 - 글로벌 변수 .. 예 알아, 나도 알아

이 테이블을 전역으로 가져와야합니다. 내 프로그램 범위 내에서 TableID를 전달하는 것이 훨씬 효율적이지 않다는 것을 깨달았습니다.

TableID = ets:new(tb, [set,public]), 
put({tableUniqueID}, TableID), 
다음

내가 사용 :

get({tableUniqueID}) 

와 동일한 기능으로는 잘 테이블 ID를 반환 ... 아직 때를

그래서 나는 그것을보고 다음 새 테이블을 만들려고 다른 함수에서 사용하면 정의되지 않은 값을 반환합니다.

무엇 ?? 외부하지 않는 작품 함수,

ets:lookup(get({tableUniqueID}), msgIn) 

같은 일이 : 나는

또한이 모든 전에 사용하면 다음과 같은 테이블 검색 함수를 호출 할 "수"실현 .. 얻을 생각과 글로벌 핵심 만들어 넣어 .. 넣어하기 문제 ..

은 그 때 나는 테이블

ets:lookup(tb, msgIn) 

의 원자를 호출하여 것이다 표를 조회하는 또 다른 방법을 실현하지만,하지 함수 내에서하지 작동하지 마십시오이 out ..

내 우선 순위는 원자로 테이블을 올려다 보는 것이 왜 불가능한지 파악하는 것입니다. 그러나 그것은 매뉴얼을 포함 해 어디서나 가장 많다고 말합니다.

내가 살 수있는 get/put은 테이블을 저장할 수있는 한 그 원자 식별자로 테이블을 조회합니다.

누구나이 딜레마를 밝힐 수 있습니까?

답변

6

I GOT IT !!

아직 더 나은 .. 조회 기능에서 를 이런 말 것, 워드 프로세서 위시, ETS에 자습서를 기록, 이상의 모든 사람이 책

있도록이 솔루션은 named_table 것을

TableID = ets:new(tb, [set,public,named_table]) 

이다 중요한

일부 사람이 페이지를 통해 파고 부분 만

)

4

문제에 대한 정답은 전역 테이블을 사용하지 않고 오히려 정보를 전달하는 것입니다. 특히 원래의 질문에서 효율성을 언급하기 때문에. 코드에 정체 지점을 만들면 모든 멀티 코어 시스템에서 성능이 저하됩니다.

ets 테이블은 다른 모든 프로세스가 값을 얻기 위해 호출해야하는 프로세스로 구현됩니다.

관련 문제