Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 20:58

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Zugrifsbereich ??

Discussion on Zugrifsbereich ?? within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
Terrat's Avatar
 
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
Terrat is offline  
Old 05/20/2015, 19:24   #2
 
hazejp's Avatar
 
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()
}
hazejp is offline  
Thanks
1 User
Old 05/20/2015, 19:24   #3

 
snow's Avatar
 
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.
snow is offline  
Thanks
1 User
Old 05/20/2015, 20:47   #4
 
Terrat's Avatar
 
elite*gold: 130
Join Date: Apr 2012
Posts: 1,173
Received Thanks: 670
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
Terrat is offline  
Thanks
1 User
Old 05/21/2015, 13:35   #5




 
Omdi's Avatar
 
elite*gold: 1
Join Date: Apr 2010
Posts: 13,772
Received Thanks: 15,036
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.
Omdi is offline  
Thanks
1 User
Old 05/21/2015, 15:24   #6
 
Terrat's Avatar
 
elite*gold: 130
Join Date: Apr 2012
Posts: 1,173
Received Thanks: 670
Quote:
Originally Posted by Omdihar View Post
Nimm einfach std::mutex und std::lock_guard

und btw.
Danke omdi,snowi und hazei
Terrat is offline  
Old 05/21/2015, 15:54   #7
 
hazejp's Avatar
 
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.
hazejp is offline  
Old 05/21/2015, 16:54   #8
 
Padmak's Avatar
 
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
Padmak is offline  
Thanks
2 Users
Reply




All times are GMT +1. The time now is 20:59.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.