2016-07-15 12 views
-1

私はCとC++要素を持つプログラムを開発中です。私はこの分野の専門家であるとは言えませんが、静的変数が静的に動作していないことに気付いています。具体的には、イベントを非同期的に受信し、イベントを静的キューにプッシュしますが、メインスレッドは静的キューからイベントをポップします。静的キューにイベントをプッシュすると、キューが1つ増えたことを明確に伝えることができ、データは正しく挿入されます。その静的なキューからポーリングすると、データが取得され、キューのサイズが0になります。これらのインスタンスが異なるインスタンスとして動作することを確認するために、非同期とポーリングの観点から値を表示しました。それに付けられている。 .cppファイルからキューを更新している間は、静的キューは.cファイルに格納されます。私はこれが問題を引き起こさないだろうがほぼ確実だが、誰が知っている。私はこだわっている。ここC/C++ Static Voodoo

はここinteractivity_mappingファイルに保存されている私の二つの変数...

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

あるインポート機能に保存されているのextern関数が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はファイルには、externインポート関数のファイルが実装されています。非同期に呼び出す関数は、このインポート関数extern cファイルの一部ではありませんが、ポーリング関数はaol_pointerと呼ばれます。私はこれがこのタイプの間違った振る舞いを引き起こすかどうかはわかりません。プログラムはかなり大きいので、私はここですべてをダンプすることなく、より良い画像を与えることはできないと思う。

+6

[mcve] – AndyG

+0

を提供してください。おそらくC++に固有のものですが、学習するコードはありません。私たちはまだ詰まっています;-) – chqrlie

+1

静的なアクセスに同期していますか? – Peter

答えて

2

静的記憶域クラスは、オブジェクトの有効期間がプログラムの実行全体であることを意味します。 static変数の指定は、シンボル(変数名)が定義の範囲内にのみ表示される静的記憶域クラスを持つことを意味します。これは、関数内にあるブロックと翻訳単位(.cファイル)がグローバルスコープ内にある場合に発生します。

staticは、シンボルが表示されていない場所からの関数やポインタを介して要素を使用できないことを意味しません。