2017-08-16 3 views
0

J'ai des problèmes avec la programmation Windows très basique, implémentant un simple système producteur/consommateur.Windows.h CONDITION_VARIABLE provoque une exception (C/C++)

Mon 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; 

ma fonction init (RAN dans le thread principal)

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

L'exception cause de la fonction init pour être jeté sur l'instruction InitializeConditionVariable, de type violation d'accès (ntdll. dll).

J'utilise Visual Studio 2017 et la compilation pour Windows x64

Merci

+6

Vous avez d'affecter l'objet section critique. changez le verrou 'LPCRITICAL_SECTION;' à 'CRITICAL_SECTION lock;' et passez '& fb.lock' à' InitializeCriticalSection' –

+1

* J'utilise Visual Studio 2017 * et ceci est étiqueté C++. Jetez un oeil à std :: vector au lieu de LPSTR, et std :: mutex, std :: condition_variable, std :: lock_guard et tous les autres goodies: http://en.cppreference.com/w/cpp/thread – stijn

+0

Système hongrois à la rescousse. Les noms de type commençant par P sont des pointeurs. Ces pointeurs ne pointent à rien. –

Répondre

4

Vous passez des pointeurs non initialisées en tant que paramètres à InitializeCriticalSection et InitializeConditionVariable. Vous devez allouer des structures appropriées et passer un pointeur vers eux au lieu:

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

...

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

Et n'oubliez pas de libérer la section critique lorsque vous avez fini de l'utiliser: 'DeleteCriticalSection (& (fb.lock));'. Vous n'avez pas besoin de libérer les variables de condition (il n'y a pas de fonction API pour le faire de toute façon). Regardez l'exemple de MSDN [Utilisation des variables de conditions] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms686903.aspx): "* Le code suivant implémente une file d'attente producteur/consommateur. *" –