|
You last visited: Today at 20:58
Advertisement
Zugrifsbereich ??
Discussion on Zugrifsbereich ?? within the C/C++ forum part of the Coders Den category.
05/20/2015, 17:57
|
#1
|
elite*gold: 130
Join Date: Apr 2012
Posts: 1,173
Received Thanks: 670
|
Zugrifsbereich ??
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
|
#2
|
elite*gold: 0
Join Date: Jan 2015
Posts: 62
Received Thanks: 13
|
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
|
#3
|
elite*gold: 724
Join Date: Mar 2011
Posts: 10,479
Received Thanks: 3,318
|
Schau dir mal std::mutex an, vor allem in Kombination mit std::lock_guard.
|
|
|
05/20/2015, 20:47
|
#4
|
elite*gold: 130
Join Date: Apr 2012
Posts: 1,173
Received Thanks: 670
|
Quote:
Originally Posted by hazejp
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
|
#5
|
elite*gold: 1
Join Date: Apr 2010
Posts: 13,772
Received Thanks: 15,036
|
Quote:
Originally Posted by Terrat
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
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
|
#6
|
elite*gold: 130
Join Date: Apr 2012
Posts: 1,173
Received Thanks: 670
|
Quote:
Originally Posted by Omdihar
Nimm einfach std::mutex und std::lock_guard
und btw.
|
Danke omdi,snowi und hazei
|
|
|
05/21/2015, 15:54
|
#7
|
elite*gold: 0
Join Date: Jan 2015
Posts: 62
Received Thanks: 13
|
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
|
#8
|
elite*gold: 58
Join Date: Jun 2008
Posts: 2,311
Received Thanks: 8,420
|
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
Padmak
|
|
|
All times are GMT +1. The time now is 20:59.
|
|