2017-08-16 72 views
0

我在使用非常基本的Windows編程時遇到了麻煩,實現了一個簡單的生產者/消費者系統。Windows.h CONDITION_VARIABLE導致異常(C/C++)

我的結構:

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; 

我的初始化函數(在主線程運行)

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

初始化函數導致異常要對InitializeConditionVariable指令拋出,類型訪問衝突(NTDLL。 DLL)。

我使用Visual Studio 2017年和編譯對於Windows x64

感謝

+6

您必須分配臨界區對象。將'LPCRITICAL_SECTION鎖;'改爲'CRITICAL_SECTION鎖;'並將'&fb.lock'傳遞給'InitializeCriticalSection' –

+1

*我正在使用Visual Studio 2017 *,並將其標記爲C++。看看std :: vector 而不是LPSTR,而std :: mutex,std :: condition_variable,std :: lock_guard和所有其他好東西:http://en.cppreference.com/w/cpp/thread – stijn

+0

匈牙利系統的救援。以P開頭的類型名稱是指針。這些指針並不指向任何東西。 –

回答

4

你傳入未初始化的指針作爲參數InitializeCriticalSectionInitializeConditionVariable。您應該分配適當的結構和一個指針傳遞給他們,而不是:

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)示例:「*以下代碼實現生產者/消費者隊列。*」 –