Zamyká si C++ paměť kvůli Read/Write anomáliím? – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Zamyká si C++ paměť kvůli Read/Write anomáliím? – C / C++ – Fórum – Programujte.comZamyká si C++ paměť kvůli Read/Write anomáliím? – C / C++ – Fórum – Programujte.com

 

Jiri K
~ Anonymní uživatel
10 příspěvků
8. 2. 2013   #1
-
0
-

Dobry den,

 chci se zeptat, používám ve své aplikaci více vláken které provádí úkony se stejným objektem. Semtam dostanu nějaká access violation error. Chtěl bych se zeptat, zda si C++ sám zamyká ty části paměti, ze kterých čte, či do nich zapisuje, aby do toho náhle nemohlo skočit jiné vlákno, nebo je třeba toto zamykaní nutné nějak provádět ručně?

Děkuji za odpověď

Nahlásit jako SPAM
IP: 90.179.206.–
Jiri K
~ Anonymní uživatel
10 příspěvků
8. 2. 2013   #2
-
0
-

#1 Jiri K
Ještě doplňuji, že nemůžu jednoduše zamknout celý objekt, neboť se pak v mém konkrétním případě mine vícevláknový přístup účinkem.

Nahlásit jako SPAM
IP: 90.179.206.–
KIIV
~ Moderátor
+43
God of flame
8. 2. 2013   #3
-
0
-

nic se nezamyka... musis pekne rucne nahazet zamky ... pokud nevyhovuje na cely objekt, muzes na jednotlivy casti... (ikdyz je to pak samy zamykani/odemykani...)

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Jiri K
~ Anonymní uživatel
10 příspěvků
8. 2. 2013   #4
-
0
-

Tak to je ale peklo, ten kod ktery musim "obohatit" o vicevlaknovy pristup je dost rozsahly, v mnoha tridach, a nedelal jsem ho ja. Prijde mi divne ze nemuzu zadat nejaky "prikaz", aby si pamet C++ zamykalo samo, to je prece blbost abych vsude strkal zamykani, to to muzu rovnou zabalit :-/

Nahlásit jako SPAM
IP: 90.179.206.–
Radek Chalupa
~ Redaktor
+1
Super člen
8. 2. 2013   #5
-
0
-

Nativní C/C++ nedělá navíc žádné zbytečnosti ani výslovné pitomosti (jako např. .NET), kterými by jen zpomalovalo program a snažilo se programátorovi dávat najevo že ví lépe co chce než to ví on sám... 

Takže pokud ti to přijde jako blbost, zabal to a přejdi na C#/.NET kde si užiješ například takových "vychytávek" jako že je kdovíproč defaultně zakázat přístup k ovládacím prvkům okna napříč vlákny.

Na to co asi potřebuješ má WinAPI dostatečné synchronizační nástroje, např. kritické sekce, do kterých uzavřeš ty části kódu kde se přistupuje do paměti sdílené napříč vlákny.

Radek Chalupa

- vývoj software na zakázku
- školení programování (C/C++, WinAPI, ATL, COM, ActiveX, C#, NET Framework, MFC)
http://www.radekchalupa.cz

Nahlásit jako SPAM
IP: 213.220.211.–
Jiri K
~ Anonymní uživatel
10 příspěvků
8. 2. 2013   #6
-
0
-

Musim to delat v C++, nemuzu jinak. Neexistuje tedy jinaci cesta, jak prinutit C++ zamykat si pamet automaticky, bez toho abych vsechno zamykal rucne? 

Nahlásit jako SPAM
IP: 90.179.206.–
KIIV
~ Moderátor
+43
God of flame
8. 2. 2013   #7
-
0
-

#6 Jiri K
to se resi az kdyz je kod hotovej? Na todle se daji aspon pouzit trosku objekty...

+ winapi ma nastroje pro woknouze... (ale zalezi na kompilatoru - sou i "emulace" posix threads)

na linuxu by to byly ty pthreads

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Jiri K
~ Anonymní uživatel
10 příspěvků
9. 2. 2013   #8
-
0
-

Nemuzu jinak, je to moje bakalarka, dostal jsem aplikaci ke ktere mam udelat paralelismus uz napsanou ucitelem v C++, ve kterem se teprve ucim. Jinak je to solution pro Visual C++, takze to delam v tomhle. Predpokladam ze tim WinAPI myslite neco, co mi umi zpristupnit to Visual C++. Diky zitra na to mrknu.

Takze se podivam na ty kriticke sekce o kterych psal Radek Ch.

Nahlásit jako SPAM
IP: 90.179.206.–
Radek Chalupa
~ Redaktor
+1
Super člen
9. 2. 2013   #9
-
0
-

#8 Jiri K
Kritické sekce můžeš použít např. nějak takhle:

CRITICAL_SECTION _critical_section; // globální proměnná

// někde na začátku aplikace:
InitializeCriticalSection(&_critical_section);

// na konci aplikace:
DeleteCriticalSection(&_critical_section);

// V každé funkci nebo metodě třídy, která může být volaná z různých vláken:

void nejaka_funckce()
{
  EnterCriticalSection(&_critical_section);
  // vlastní kód funkce
  LeaveCriticalSection(&_critical_section);
}

Radek Chalupa
- vývoj software na zakázku
- školení programování (C/C++, WinAPI, ATL, COM, ActiveX, C#, NET Framework, MFC)
http://www.radekchalupa.cz

Nahlásit jako SPAM
IP: 213.220.211.–
KIIV
~ Moderátor
+43
God of flame
9. 2. 2013   #10
-
+1
-
Zajímavé

#9 Radek Chalupa
a pak ti neco hodi vyjimku, skocis ven pred leave critical section a zustanes v ni na veky veku :)

Na to jsou prave super ty objekty... jak skonci platnost jejich rozsahu, zavola se destruktor... je pak tezke nekde vyskocit z funkce ci metody, aniz by se zapomelo uvolnit resource

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Grungy0
Super člen
9. 2. 2013   #11
-
0
-

Nepoznám štruktúru kódu, ale ak ide o nejakú triedu ktorú napísal učiteľ a ty potrebuješ len zabezpečiť aby sa na jednotlivé volania metód aplikovali zámky, tak sa dá spraviť to, že z učitelovej triedy podedíš inú v ktorej implementuješ všetky metódy tak, že urobia lock vykonajú metódu predka a potom spravia unlock. Odvodená trieda bude thread save, zatiaľ čo pôvodná trieda ostane nedotknutá. Ako som ale spomínal, najprv je potrebné zhodnotiť, či je tento postup vhodný aj pre to čo potrebuješ ty.

Nahlásit jako SPAM
IP: 188.123.100.–
Prvý náznak hlúposti, je pocit geniality.
Jiri K
~ Anonymní uživatel
10 příspěvků
9. 2. 2013   #12
-
0
-

K tem kritickym sekcim - pokud uvedu cely objekt do kriticke sekce, abych nemusel metody nebo dokonce casti metod uvadet do kriticke sekce, v podstate to skonci serializaci, je to tak?

KIIV: dekuji za odpoved, nechapu to ale presne jak to myslite s objekty - v podsttae cely ten projekt je objektove orientovany a presto mi to nepomuze s resenim problemu.

Zatim se mi nejvice libi napad od Grungeho, hlavne proto ze vim jak to udelat:

Tady je ten projekt kdyby ho chtel nekdo videt (v puvodni verzi): https://www.dropbox.com/sh/fxki268e1p33wef/dNr9wZ9pgW

Nahlásit jako SPAM
IP: 90.179.206.–
vitamin+8
Grafoman
9. 2. 2013   #13
-
+1
-
Zajímavé

#1 Jane
KIIV myslel nieco taketo:

CRITICAL_SECTION _critical_section; // globální proměnná
class CriticalSection{
		CRITICAL_SECTION* c;
	public:
		CriticalSection(CRITICAL_SECTION& c)c(&c){
			EnterCriticalSection(c);
		}
		~CriticalSection(){
			LeaveCriticalSection(c);
		}
};
//pouzitie:
void nejaka_funckce()
{
	CriticalSection(_critical_section);
 
  	// vlastní kód funkce

}
	
	
Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
KIIV
~ Moderátor
+43
God of flame
9. 2. 2013   #14
-
0
-

no jde o miniaturni tridu s konstruktorem prebirajici referenci na zamek a ten se rovnou zamkne... 

v destruktoru je pak zase uvolneni...

class neco {
  private:
    mutex & m_mutex;
  public:
    neco(mutex m): m_mutex(m) { lock(m_mutex); }
    ~neco() { unlock(m_mutex); }
};


....

  // kriticka sekce pro nejakou promennou:
  {
    neco x(mutex_nejaka);
    if (kontrola) { return; } // i pri returnu se pekne odemkne
    .....
  }
  // tady je uz zase odemcena... 
Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
vitamin+8
Grafoman
9. 2. 2013   #15
-
0
-
Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
KIIV
~ Moderátor
+43
God of flame
9. 2. 2013   #16
-
0
-

#15 vitamin
tak tak.. jen se pro jistotu ujistit jaky kompilator to dela.. aby to pak vubec jeste umel (visual studio 2010 by s tim mit problem mohlo - podporovalo neco z C++11, ale zdaleka ne to co treba gcc 4.6+)

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
vitamin+8
Grafoman
9. 2. 2013   #17
-
0
-

#16 KIIV
Ale je uz rok 2013, novy standart vysiel v roku 2011 a vela veci bolo znamich uz pred zchvalenim standartu tak predpokladam ze ma aktualny kompilator  

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
9. 2. 2013   #18
-
0
-

#17 vitamin
ne každý, někdo bojuje se zaměstnavatelem o upgrade i několik let. Vlastní zkušenost   

hu

Nahlásit jako SPAM
IP: 188.95.60.–
Pomeranc0
Duch
9. 2. 2013   #19
-
0
-
Nahlásit jako SPAM
IP: 83.240.91.–
Jiri K
~ Anonymní uživatel
10 příspěvků
15. 2. 2013   #20
-
0
-

Dekuji za rady, rozhodl jsem udelat kriticke sekcep pres objekty.

 Co se mi ale moc nelibi je ta globalni promenna. Muzu ji dat samozrejme do .cpp souboru kde je main(), ale moc se mi to nelibi, prijde mi to takove neprenosne. Napriklad kdybych chtel pak tuhle QuickDB aplikaci (tak se jmenuje) pouzit v jine aplikaci jako embedded databazi, tak mi ta globalni promenna nebude fungovat, chapu to spravne? A pak mi prijde jako blbost v takove nove aplikaci, ktera QuickDB pouziva, implementovat dalsi globalni CriticalSection - ta aplikace kterou delam by mela byt funkcni sama o sobe. Snad rozumite co myslim. 

Jasne, CriticalSection by se dala predavat zkrze objekty, ptam se vas spise na nejelegantnejsi reseni tohoto problemu.

Dekuji

Nahlásit jako SPAM
IP: 90.179.206.–
z
~ Anonymní uživatel
268 příspěvků
15. 2. 2013   #21
-
0
-

Na co se sakra ptáš? Když zamykání neuděláš v QuickDB, tak tam nebude. Když QuickDB uděláš nějakým způsobem thread-safe, tak taková bude pro všechny. Globální proměnnou ti nikdo necpe.

Nahlásit jako SPAM
IP: 78.156.159.–
Jiri K
~ Anonymní uživatel
10 příspěvků
15. 2. 2013   #22
-
0
-

Dekuji za odpoved a kdyz uz jste me tak sjel, nevite jak je to s dedenim trid a konstruktory? Kdyz podedim ze tridy, bude se mi u potomka spoustet automaticky konstruktor predka?

Nahlásit jako SPAM
IP: 90.179.206.–
Jiri K
~ Anonymní uživatel
10 příspěvků
15. 2. 2013   #23
-
0
-

Mimochodem, ptam se treba na to, jestli se podobna vec neda dobre vyresit nejakym navrhovym vzorem, spise nez globalni pormennou nebo otrockym predavanim skrze objekty, nejsem blbej ale ani nejsem expert ;)

Nahlásit jako SPAM
IP: 90.179.206.–
vitamin+8
Grafoman
15. 2. 2013   #24
-
0
-

#22 Jiri K
Najprv sa spustaju konstruktory predkov, potom sa spustaju konstruktory atributov a az potom nasleduje telo tvojho konstruktoru: 

struct B{

};

struct D : B{
	B b1;
	B b2;
	
	D:
	   B(),		//najprv sa vola konstruktor bazy
           b1(),	//potom 1. atribut
	   b2(){	//potom 2. atribut
	//bazova trieda a vsetky atributy su uz inicialiovne:
	...
	}
};
	

Pouzivanie globalnych premennych na synchronyzovanie vlakjen je uplne normalny sposob (lokalnymi premennymi to ide blbo :)  ). 

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
KIIV
~ Moderátor
+43
God of flame
15. 2. 2013   #25
-
0
-

ale automaticky se provedou jen konstruktory bez parametru.. pokud je nemas povolene, musi se urcit s jakymi parametry se ma spustit...

konstruktor:     Trida(int blabla): TridaBase(blabla) { ... kod konstruktoru ... }

takhle se daji i inicializovat polozky Tridy, ktere nemaji konstruktor bez parametru nebo chces nainicializovat jinak ...

Nahlásit jako SPAM
IP: 94.112.35.–
Program vždy dělá to co naprogramujete, ne to co chcete...
JK
~ Anonymní uživatel
20 příspěvků
28. 2. 2013   #26
-
0
-

Dobrý den,

 mám problém s řešením p. KIIV pro CriticalSection jakozto objekt. Měl se zpustit jeho destruktor když funkce skončí, bohužel se tak neděje.

Takto jsem implementoval CritikalSection objekt:

class cCriticalSection{

protected:
	CRITICAL_SECTION *mLock;
public:
	cCriticalSection(CRITICAL_SECTION &lock){
		mLock = &lock;
		EnterCriticalSection(mLock);
	}
	~cCriticalSection(){
		LeaveCriticalSection(mLock);
	}
};

 Zde je funkce, která se spouští v jednotlivých vláknech. Kritická sekce se ukonci jen pokud rucne vlozim destruktor, jinak je kriticka sekce aktivovana neustale :-/

int Testovaci(int i ,char* data)
{
	cCriticalSection *c = new cCriticalSection(criticSection);
		int insertFlag = Tree->Insert(dataCollection[i], data); /*Tree->Insert_MP(dataCollection[i], data);*/
		c->~cCriticalSection(); //bohuzel nutne :-/
		return insertFlag;
}

Mimochodem takto se to chová i v cyklu for, kde bych ocekaval ze se destruktor spusti pri kazdem novem cyklu. :-/

Nevíte pls jake je reseni tohoto problemu?

Nahlásit jako SPAM
IP: 90.179.206.–
Jiri K.
~ Anonymní uživatel
16 příspěvků
28. 2. 2013   #27
-
0
-

Jeste dodavam ze pouzivam MS Visual Studio 2012

Nahlásit jako SPAM
IP: 90.179.206.–
KIIV
~ Moderátor
+43
God of flame
28. 2. 2013   #28
-
0
-

nesmis to mit jako dynamicky alokovany objekt... to funguje jen pro "staticke" promenne (objekt) :)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Jiri K.
~ Anonymní uživatel
16 příspěvků
28. 2. 2013   #29
-
0
-

Děkuju, už to funguje. Ještě takový detail, spouští se destruktor ve funkci až za return? Chci mít jistotu, že bude objekt zamčený po celou dobu čtení, například při volání různých Get metod.

Nahlásit jako SPAM
IP: 90.179.206.–
KIIV
~ Moderátor
+43
God of flame
28. 2. 2013   #30
-
0
-

jj az pred navratem z funkce a nebo metody se uvolnuji objekty..   (ale funguje to i kdyz se zavola vyjimka nekde uvnitr ... jak to vyskoci ze scope promenne tak se uvolnuje)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 23 hostů

Podobná vlákna

Qtcpsocket read write vytváři nová vlákna? — založil rodinne.baleni.ryze

Qtcpsocket read write vytvari nove vlakno? — založil rodinne.baleni.ryze

FUSE operace write — založil Honza

System.in.read() — založil David

System.in.read(); — založil SVKSuli

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý