Hall,
ich habe eine funktion die von ca. 20-40 Threads oder mehr aufgerufen wird. Allerdings möchte ich das die Funktion nur von 1 Thread gleichzeitig aufgerufen werden kann. Wie erreiche ich das ?
Thread 1 -> test();
Thread 2 -> test(); <- wartet solange bis das Thread 1 die funktion abgeschlossen hat
#include <Windows.h>
static CRITICAL_SECTION myCriticalSection;
#define THREAD_LOCK () EnterCriticalSection(&myCriticalSection);
#define THREAD_UNLOCK() LeaveCriticalSection(&myCriticalSection);
BOOL WINAPI DllMain(HINSTANCE hInstDll, DWORD fdwReason, LPVOID lpvReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
// Critical Section initialisieren
InitializeCriticalSection(&myCriticalSection);
return TRUE;
case DLL_PROCESS_DETACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
return TRUE;
}
return FALSE;
}
void foo()
{
// Kann nur von einem Thread gleichzeitig aufgerufen werden,
// andere Threads müssen so lange auf das Signal warten
THREAD_LOCK()
// deinen Code hier hin
THREAD_UNLOCK()
}
#include <Windows.h>
static CRITICAL_SECTION myCriticalSection;
#define THREAD_LOCK () EnterCriticalSection(&myCriticalSection);
#define THREAD_UNLOCK() LeaveCriticalSection(&myCriticalSection);
BOOL WINAPI DllMain(HINSTANCE hInstDll, DWORD fdwReason, LPVOID lpvReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
// Critical Section initialisieren
InitializeCriticalSection(&myCriticalSection);
return TRUE;
case DLL_PROCESS_DETACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
return TRUE;
}
return FALSE;
}
void foo()
{
// Kann nur von einem Thread gleichzeitig aufgerufen werden,
// andere Threads müssen so lange auf das Signal warten
THREAD_LOCK()
// deinen Code hier hin
THREAD_UNLOCK()
}
werde ich austesten <3
Ich sehe gerade das es eine exception bei einen zu hohen timeout giebt. Kann ich diesen deaktivieren oder sollte ich TryEnterCriticalSection in einer Schleifen kombi nutzen?
while(!TryEnterCriticalSection(..)){}
Die schleife sollte ja den selben Effekt haben nur das sie keine exception giebt.
Ps: net wundern habe das gerade am handy getippt
Ich sehe gerade das es eine exception bei einen zu hohen timeout giebt. Kann ich diesen deaktivieren oder sollte ich TryEnterCriticalSection in einer Schleifen kombi nutzen?
while(!TryEnterCriticalSection(..)){}
Die schleife sollte ja den selben Effekt haben nur das sie keine exception giebt.
Ps: net wundern habe das gerade am handy getippt
Quote:
Originally Posted by snow
Schau dir mal std::mutex an, vor allem in Kombination mit std::lock_guard.
Nimm einfach std::mutex und std::lock_guard
und btw.
Quote:
This function can raise EXCEPTION_POSSIBLE_DEADLOCK if a wait operation on the critical section times out. The timeout interval is specified by the following registry value: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Contro l\Session Manager\CriticalSectionTimeout. Do not handle a possible deadlock exception; instead, debug the application.
Du könntest, wenn du C++ verwendest, wie bereits erwähnt std::mutex benutzen, oder, wenn du C verwendest, schau dir mal die Funktion InitializeCriticalSectionAndSpinCount() an.
Ich würde empfehlen SpinCount dementsprechend hoch bzw. niedrig zu setzen, wie lange deine Funktion zur Ausführung braucht.
Er benutzt zu 99% C++, weil auch seine letzten Fragen alle in C++ waren
Hör bitte auf die WinAPI für Sachen zu bewerben, die die STL von ganz alleine in wesentlich einfacher, kürzer und sicherer kann