Zugrifsbereich ??

05/20/2015 17:57 Terrat#1
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
05/20/2015 19:24 hazejp#2
Nennt sich Threadsynchronisation:

Code:
#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()
}
05/20/2015 19:24 snow#3
Schau dir mal std::mutex an, vor allem in Kombination mit std::lock_guard.
05/20/2015 20:47 Terrat#4
Quote:
Originally Posted by hazejp View Post
Nennt sich Threadsynchronisation:

Code:
#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
05/21/2015 13:35 Omdi#5
Quote:
Originally Posted by Terrat View Post
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
Quote:
Originally Posted by snow View Post
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.
05/21/2015 15:24 Terrat#6
Quote:
Originally Posted by Omdihar View Post
Nimm einfach std::mutex und std::lock_guard ;)

und btw.
Danke omdi,snowi und hazei
05/21/2015 15:54 hazejp#7
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.
05/21/2015 16:54 Padmak#8
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 :D

Padmak