PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : std::queue und MT


del_4901
2007-07-23, 17:49:56
Wie sieht das eigendlich aus, wenn ich mehrere Threads habe die in die queue pushen, aber nur einen der drauß popt. Muss ich dann nur push syncronisieren, oder auch pop ... das ist sicherlich implementierungspezifisch, ich verwende VS8.

Ich stelle die Frage deswegen, weil einige geistreiche Prof's der Meinung sind, das man um "Speicher zu spaaren" (4-8byte) den Anfang der Queue im next Pointer des Endes zu speichern. Mir ist natürlich schleierhaft, wofür eine QUEUE dann noch gut sein soll.

Coda
2007-07-23, 17:57:00
Musst du alles synchronisieren. Die STL ist per-se nicht multithreading save ausgelegt.

del_4901
2007-07-23, 17:59:04
Musst du alles synchronisieren. Die STL ist per-se nicht multithreading save ausgelegt.

Das ist mir auch klar, aber wenn die Queue das Ende extra speichert, muss ich doch nur die push Operation syncronisieren? Oder hat einer nen Gegenbeispiel für meinen "Denkfehler"?

Coda
2007-07-23, 18:02:11
pop fummelt doch genauso mit den internen Dingen der queue rum. Ich glaub kaum, dass es gesund ist, wenn push und pop parallel laufen.

del_4901
2007-07-23, 18:04:47
pop fummelt doch genauso mit den internen Dingen der queue rum. Ich glaub kaum, dass es gesund ist, wenn push und pop parallel laufen.

Genau das ist die Frage ... bei einer einfach verlinkten Liste sollte das doch kein Problem sein, oder? Ich brauch den Fall wo das schiefgeht, weil solange es den nicht gibt syncronisier ich den nicht.

Das dumme ist, das bei meinen Tests der Fall noch nicht aufgetreten ist ... wie das halt so sein kann mit Critical Sections.

del_4901
2007-07-23, 18:32:34
Ok, jetzt habe ich etwas "agressiver" getestet und promt kahm auch ne execption. Jetzt muss mir nur mal jemand verraten an welcher Stelle. 8-) Also wenn die in der stl nen Ring verwenden, dann weiß ich wo... aber wenn es ne verkettete Liste mit anfang und ende ist, hab ich irgendwo was nicht bedacht.

Nächster Test ... im ungüstigen Fall gibts auch leaks.

Coda
2007-07-23, 19:04:54
VC8 std::list benützt auf jeden Fall einen Ring - das weiß ich. Aber std::queue hat doch per default eh eine deque als Implementierungsgrundlage.

Sich auf implementierungsspezifische Dinge zu verlassen ist sowieso Selbstmord! Wenn du eine Queue brauchst die so funktioniert, dann schreib sie selber.

del_4901
2007-07-23, 20:08:04
VC8 std::list benützt auf jeden Fall einen Ring - das weiß ich. Aber std::queue hat doch per default eh eine deque als Implementierungsgrundlage.

Sich auf implementierungsspezifische Dinge zu verlassen ist sowieso Selbstmord! Wenn du eine Queue brauchst die so funktioniert, dann schreib sie selber.

Du hast recht! Es gibt sogar noch einen Speziallfall, den man auch locken muss..und zwar wenn die liste weniger als 2 elemente hat.

Eruphus
2007-07-23, 21:23:18
Hi,

laut MSDN ist std::queue nicht mal TS für einen Reader und einen Writer.
Für 2 Writer auch nicht.

Einzig alleine ist es möglich mehrere Lesevorgänge parallel zu verarbeiten.

Meiner Meinung nach ein Wiederspruch.
Ich würde wohl alle Situationen abfangen und synchronisieren ...

siehe dazu :
http://msdn2.microsoft.com/en-us/library/c9ceah3b(VS.80).aspx

MFG Eruphus