2017-08-16 25 views
0

私は非常に基本的なWindowsプログラミングに問題があり、単純なプロデューサ/コンシューマシステムを実装しています。Windows.h CONDITION_VARIABLEは例外(C/C++)を発生させます

私のstruct:

typedef struct FILE_BUFFER { //Circular buffer of max size BUF_SIZE 
    INT count;   //buffer size 
    LPTSTR buf[BUF_SIZE]; //actual buffer of file names 

    BOOL stopRequested; //Exit flag 

    LPCRITICAL_SECTION lock; //Synch stuff 
    PCONDITION_VARIABLE notEmpty; 
    PCONDITION_VARIABLE notFull; 
}FILE_BUFFER; 

FILE_BUFFER fb; 

私のinit関数は、init関数の原因の例外は型アクセス違反(NTDLLで、InitializeConditionVariable命令にスローされるように

VOID init() { 
    fb.stopRequested = FALSE; 
    fb.count = 0; 
    InitializeCriticalSection(fb.lock); 
    InitializeConditionVariable(fb.notEmpty); 
    InitializeConditionVariable(fb.notFull); 
} 

を(メインスレッドで実行されていました)。 dll)。

私は、Visual Studio 2017を使用していますし、あなたがInitializeCriticalSectionInitializeConditionVariableにパラメータとして初期化されていないポインタを渡しているのWindows x64のため

おかげ

+6

あなたはクリティカルセクションオブジェクトを割り当てる必要があります。 'LPCRITICAL_SECTION lock;'を 'CRITICAL_SECTION lock;'に変更し、 '&fb.lock'を' InitializeCriticalSection'に渡します。 –

+1

*私はVisual Studio 2017 *を使用しています。 LPSTRの代わりにstd :: vector を見て、std :: mutex、std :: condition_variable、std :: lock_guardおよびその他すべての機能をお試しください:http://en.cppreference.com/w/cpp/thread – stijn

+0

システムハンガリー語を救助する。 Pで始まる型名はポインタです。これらのポインタは何も指していません。 –

答えて

4

をコンパイルします。あなたは適切な構造体を割り当て、その代わりにそれらへのポインタを渡す必要があります。

CRITICAL_SECTION lock; //Synch stuff 
CONDITION_VARIABLE notEmpty; 
CONDITION_VARIABLE notFull; 

...

InitializeCriticalSection(&(fb.lock)); 
InitializeConditionVariable(&(fb.notEmpty)); 
InitializeConditionVariable(&(fb.notFull)); 
+0

重要なセクションを使用し終わったら、クリティカルセクションをリリースすることを忘れないでください: 'DeleteCriticalSection(&(fb.lock));'。条件変数を解放する必要はありません(とにかくそれを行うAPI関数はありません)。 MSDNの[条件変数の使用](https://msdn.microsoft.com/en-us/library/windows/desktop/ms686903.aspx)の例を参照してください。*次のコードは、プロデューサ/コンシューマキュー*を実装しています。 –

関連する問題