Ik heb een DLL gemaakt, die een plugin voor een simulatie programma is.
Het simulatie programma gebruikt de volgende methode: (in chronologische volgorde)
- Initialize()
- InitializeRun()
- myFunction()
- TerminateRun()
- Terminate()
myFunction wordt elke simulatie stap aangeroepen.
De DLL maakt gemaakt van een shared memory object die met een mutex beheerd wordt. De mutex wordt alsvolgt aangemaakt:
Nu wordt by InitializeRun de mutex gepakt (omdat tijdens de simulatie het shared memory aangepast wordt) mbt: (de mutex wordt correct gepakt en komt in de case WAIT_OBJECT_0)
Dan bij TerminateRun()
Deze geeft een 0 terug, oftewel er iets niet goed gegaan.
Het blijkt dat ik de mutex gewoon weer kan pakken met de code zoals bij InitializeRun staat.
Mijn vraag is nu hoe het komt dat ie al vrijgegeven is, of gaat dat vanzelf als een methode afgesloten wordt. En hoe kan ik dit voorkomen. Ik wil de code niet in de simulatie stap zetten ivm snelheid.
Tevens doe de andere applicatie (die ook het shared memory kan wijzigen) helemaal niets. De fout zit hem dus echt in deze code.
Het simulatie programma gebruikt de volgende methode: (in chronologische volgorde)
- Initialize()
- InitializeRun()
- myFunction()
- TerminateRun()
- Terminate()
myFunction wordt elke simulatie stap aangeroepen.
De DLL maakt gemaakt van een shared memory object die met een mutex beheerd wordt. De mutex wordt alsvolgt aangemaakt:
C++:
1
2
| TCHAR szNameMutex[]=TEXT("Mutex_name"); HANDLE hMutex = CreateMutex(NULL,FALSE,szNameMutex); |
Nu wordt by InitializeRun de mutex gepakt (omdat tijdens de simulatie het shared memory aangepast wordt) mbt: (de mutex wordt correct gepakt en komt in de case WAIT_OBJECT_0)
C++:
1
2
3
4
5
6
7
8
9
10
11
| DWORD dwWaitResult; // Request ownership of mutex. dwWaitResult = WaitForSingleObject(hMutex,1000L); // 1 second time-out interval switch (dwWaitResult){ case WAIT_OBJECT_0: // Wat inits voor simulatie, mutex wordt NIET vrijgegeven return 1; // return 1=gelukt, 0=niet gelukt case WAIT_TIMEOUT: return 0; case WAIT_ABANDONED: return 0; } |
Dan bij TerminateRun()
C++:
1
2
| ReleaseMutex(hMutex); |
Deze geeft een 0 terug, oftewel er iets niet goed gegaan.
Het blijkt dat ik de mutex gewoon weer kan pakken met de code zoals bij InitializeRun staat.
Mijn vraag is nu hoe het komt dat ie al vrijgegeven is, of gaat dat vanzelf als een methode afgesloten wordt. En hoe kan ik dit voorkomen. Ik wil de code niet in de simulatie stap zetten ivm snelheid.
Tevens doe de andere applicatie (die ook het shared memory kan wijzigen) helemaal niets. De fout zit hem dus echt in deze code.
if broken it is, fix it you should