2016-07-15 3 views
-1

나는 C와 C++ 요소를 가진 프로그램을 만들고있다. 나는이 영역에서 내가 전문가라고 말할 수는 없지만 정적 변수가 정적으로 작용하지 않는다는 것을 알아 차리고있다. 특히 이벤트를 비동기 적으로 수신 한 다음 이벤트를 정적 대기열로 푸시하는 동안 주 스레드가 해당 대기열에서 이벤트를 팝합니다. 이벤트를 정적 대기열로 푸시 할 때 대기열 증가분을 1 씩 알 수 있고 데이터가 올바르게 채워질 수 있습니다. 그 정적 대기열에서 폴링을하면 데이터가 대기열 크기가 0이됩니다. 다른 인스턴스로 작동하는지 확인하기 위해 비동기 및 폴링 관점에서 값을 인쇄했으며 변수에 악취가 나는 정적 인 경우에도 항상 일관되게 다릅니다. 그것에 붙어있다. 정적 큐는 .cpp 파일에서 큐를 업데이트하는 동안 .c 파일에 저장됩니다. 나는 이것이 문제를 일으키지 않을 것이 거의 확실하다는 것을 거의 확신한다. 나는 여기에 C/C++ 정적 부두

/* Pointer storage */ 
static sdy_pointer_event_t pointer_events[MAX_POINTERS] = {0}; 
static int last_pointer_event = 0; 

이 interactivity_mapping에 기본적으로

/* Imported functions */ 
extern void GetId(SGLint32 (*WidgetId)); 
extern void ManageIndividualFocus(SGLbool RequestFocus, SGLbool RequestNoFocus, SGLint32 WidgetId, SGLbool IsContainer, SGLint32 NextWidgetId, SGLbool isInit, SGLint32 (*HasFocus)); 
extern void aol_keyboard(SGLint32 pKeyboard, SGLbool* pPressed, SGLbool* pReleased, SGLint32* pCode, SGLint32* pModifiers); 
extern void aol_locate(SGLint32 pPointer, SGLfloat* pX, SGLfloat* pY); 
extern void aol_pointer(SGLint32 pPointer, SGLbool* pPressed, SGLbool* pReleased, SGLint32* pButton, SGLfloat* pX, SGLfloat* pY, SGLint32* pModifiers); 
extern void wrapper_PushButton(SGLint32 EmitCondition, SGLbool MouseInside, SGLbool MousePressed, SGLbool MouseReleased, SGLbool KeyPressed, SGLint32 KeyCode, SGLbool KeyReleased, SGLbool (*Selection), SGLbool (*ButtonPressed), wrapper_PushButton_mem* mem); 
extern void wrapper_PushButton_reset(wrapper_PushButton_mem* mem); 

파일 c는 가져온 기능에 저장된 통근 함수입니다 ... 여기

가 interactivity_mapping 파일에 저장 내 두 변수는

붙어있어 파일에는 extern 가져온 함수 c 파일의 구현이 있습니다. 비동기 적으로 호출하는 함수는이 가져온 함수 extern c 파일의 일부가 아니며 폴링 함수는이며 aol_pointer라고합니다. 비록 이것이 이런 종류의 잘못된 행동을 일으키는 지 모르겠다. 프로그램이 꽤 크기 때문에 여기에 모든 것을 던지지 않고 더 좋은 그림을 줄 수는 없다고 생각합니다.

+6

[mcve] – AndyG

+0

을 제공하십시오. 아마도 C++과 유사하지만 학습 할 코드가 없습니다. 우리는 여전히 붙어 있습니다 ;-) – chqrlie

+1

정적 액세스를 동기화하고 있습니까? – Peter

답변

2

정적 저장소 클래스는 개체의 수명이 프로그램의 전체 실행임을 의미합니다. static 변수 지정은 정적 저장소 클래스 을 가지며 기호 (변수 이름)는 정의의 범위, 함수에있을 때 블록 및 번역 단위에서만 볼 수 있음을 의미합니다 (.c 파일) 전역 범위에있을 때.

static은 기능을 통해 또는 기호가 표시되지 않는 곳의 포인터를 통해 요소를 사용할 수 없다는 것을 의미하지 않습니다.