2009-03-21 2 views
2

는 일반적으로 다음과 같이 전 세계적으로 사용할 수있는 변수의 .cpp 파일 결과에 변수를 사용하여 :C++에서 프로세스 전역 변수를 구현하는 방법은 무엇입니까?

.cpp 파일이 정적 라이브러리에 넣고 한 개 이상의 공유 라이브러리 (DLL)입니다
.h file: 
extern int myGlobal; 
void work(); 

.cpp file: 
int myGlobal = 42; 
void work(){ myGlobal++; } 

또는 정적 라이브러리에 대한 실행 가능 링크에는 각각 myGlobal의 자체 사본이 있습니다. work()는 변수의 자체 버전을 수정합니다.

내 질문에 대한 답 : 프로세스 전체의 고유 변수 또는 해당 변수에 대한 포인터를 가져 오는 방법이 있습니까? 스레드 전역 변수에 대한 스레드 로컬 저장소와 유사합니다. 그것은 플랫폼에 독립적 일 필요는 없습니다. Win32에서 작동하는 보너스 포인트 :

답변

4

단순 : 프로세스 링크의 모든 DLL을 변수를 노출하는 단일 DLL로 만듭니다.

3

DLL에 정적으로 링크하지 않거나 정적 라이브러리에 한 번만 연결하십시오 (잠재적으로 목에 통증이 더 많이 생길 수 있음).

0

Boost.Interprocess, 특히 복수 프로세스간에 메모리를 공유 할 때 this page을 살펴 보시기 바랍니다. 이 라이브러리를 사용하여 공유 메모리 공간을 생성하고 이미 생성 된 것을 열어 (실제로 "열거 나 생성"), 필요에 맞게 크기를 조정하고 액세스하는 방법을 찾을 수 있습니다. 꽤 빨리 진행될 수있는 간단한 예가 있습니다.

+0

질문은 "프로세스 전체"라는 말로 여러 프로세스가 아닙니다. 동일한 프로세스 내의 공유 메모리는 아마도 약간의 과잉이다. –

+0

당신 말이 맞아요. 그러나 효과가 있으며 사용하기가 어렵지 않습니다. 그래서 왜 안돼 ? :) –

+0

주의 : boost :: interprocess는 함정과 잡았다로 가득합니다. 예를 들어, 일부 플랫폼에서는 대기 상태와 같이 업무를 많이 수행하는 경향이 있습니다. 사용중인 부스트 코드를 읽었는지 확인하십시오. –

0

아마도 이것은 하나의 프로세스에 대한 잔인한 행동이지만, 사용자가 설명하는 것과 유사한 것을 달성하기 위해 shared sections을 사용했습니다.

+0

프로세스 전체 변수 만 필요하기 때문에 공유 섹션이 너무 많습니다. 그래도 제안을 주셔서 감사합니다! – vividos

관련 문제