Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Mär 28, 2024 16:42

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: c++ atomic Verwirrung
BeitragVerfasst: Mo Feb 01, 2016 22:45 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Hallo allerseits,

bin gerade etwas Verwirrt was die "atomic"-Funktionen im C++-Standard angeht. Unter Windows gibt es ja die entsprechenden Macros, allerdings scheinen diese sich komplett anders zu verhalten als ich erwarte:

Code:
  1.  
  2. //mit windows header
  3.     void append(const type & value)
  4.     {
  5.         node * next = new node(value);
  6.        
  7.         node * prev = (node*)InterlockedExchangePointer (&last,next);
  8.        
  9.         if (InterlockedCompareExchangePointer(&first,next,nullptr))
  10.         {
  11.             prev->next = next;
  12.         }
  13.     }
  14.  
  15. //mit atomic header
  16.     void append(const type & value)
  17.     {
  18.         static node * nil = nullptr;
  19.  
  20.         node * next = new node(value);
  21.        
  22.         node * prev = last.exchange(next);
  23.        
  24.         if (!first.compare_exchange_strong(nil,next))
  25.         {
  26.             prev->next = next;
  27.         }
  28.     }
  29.  


Wenn ich nun aber klassisch von first bis null gehe, dann bekomme ich für den "atomic"-Header aber totalen Müll. Ist das normal oder ist da etwas mit meiner Installation kaputt?

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: c++ atomic Verwirrung
BeitragVerfasst: Di Feb 02, 2016 12:14 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Schwierig, sieht auf den ersten Blick richtig aus. Kannst du details zum "kompletten Müll" geben? Gibt es korrelationen zu bisherigen Werten von last? Kannst du mal ein kurzes, vollständiges Beispiel posten, sodass wir das mal lokal testen können?

viele Grüße,
Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: c++ atomic Verwirrung
BeitragVerfasst: Di Feb 02, 2016 18:25 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Mhh dann liegt es wohl vermutlich daran das ich den Typen falsch benutze oder so? Mhh keine Ahnung, anbei einmal ein paar einfach Listen mit beiden Versionen:
Code:
  1.  
  2.  
  3. #include <stdio.h>
  4. #include <windows.h>
  5. #include <atomic>
  6.  
  7. template<class type>
  8. class list
  9. {
  10. public:
  11.  
  12.     list(void) : first(), last()
  13.     {
  14.         first = nullptr;
  15.         last = nullptr;
  16.     }
  17.  
  18.     void enqueue(const type & value)
  19.     {
  20.         node * next = new node(value);
  21.         node * prev = (node*) InterlockedExchangePointer(&last, next);
  22.         if (InterlockedCompareExchangePointer(&first, next, nullptr))
  23.         {
  24.             prev->next = next;
  25.         }
  26.     }
  27.  
  28.     bool dequeue(type & target)
  29.     {
  30.         volatile node * tmp = first;
  31.         if (tmp && InterlockedCompareExchangePointer(&first, tmp->next, tmp) == tmp)
  32.         {
  33.             target = tmp->value;
  34.             return true;
  35.         }
  36.         return false;
  37.     }
  38.  
  39.     bool empty(void) const
  40.     {
  41.         return first == nullptr;
  42.     }
  43.  
  44.  
  45. private:
  46.  
  47.     struct node
  48.     {
  49.         type value;
  50.         node * next;
  51.  
  52.         node(const type & _value) :
  53.         value(_value),
  54.         next(nullptr)
  55.         {
  56.         }
  57.     };
  58.     volatile node* first;
  59.     volatile node* last;
  60. };
  61.  
  62. template<class type>
  63. class list_atomic
  64. {
  65. public:
  66.  
  67.     list_atomic(void) : first(), last()
  68.     {
  69.         first = nullptr;
  70.         last = nullptr;
  71.     }
  72.  
  73.     void enqueue(const type & value)
  74.     {
  75.         static node * nil = nullptr;
  76.         node * next = new node(value);
  77.         node * prev = last.exchange(next);
  78.         if (!first.compare_exchange_strong(nil, next))
  79.         {
  80.             prev->next = next;
  81.         }
  82.     }
  83.  
  84.     bool dequeue(type & target)
  85.     {
  86.         node * tmp = first;
  87.         if (tmp && first.compare_exchange_strong(tmp, tmp->next))
  88.         {
  89.             target = tmp->value;
  90.             return true;
  91.         }
  92.         return false;
  93.     }
  94.  
  95.     bool empty(void) const
  96.     {
  97.         return first == nullptr;
  98.     }
  99.  
  100.  
  101. private:
  102.  
  103.     struct node
  104.     {
  105.         type value;
  106.         node * next;
  107.  
  108.         node(const type & _value) :
  109.         value(_value),
  110.         next(nullptr)
  111.         {
  112.         }
  113.     };
  114.     volatile std::atomic<node*> first;
  115.     volatile std::atomic<node*> last;
  116. };
  117.  
  118. int main(int argc, char** argv)
  119. {
  120.     int i = 0;
  121.     list<int> test;
  122.     list_atomic<int> testb;
  123.     for (i = 0; i < 20; i++)
  124.     {
  125.         test.enqueue(i);
  126.         testb.enqueue(i);
  127.     }
  128.     while (test.dequeue(i))
  129.     {
  130.         printf("%i\n", i);
  131.     }
  132.     printf("================\n");
  133.     while(testb.dequeue(i)) {
  134.         printf("%i\n", i);
  135.     }
  136.  
  137.     return EXIT_SUCCESS;
  138. }
  139.  


Ausgabe:

Code:
  1.  
  2. 0
  3. 1
  4. 2
  5. 3
  6. 4
  7. 5
  8. 6
  9. 7
  10. 8
  11. 9
  12. 10
  13. 11
  14. 12
  15. 13
  16. 14
  17. 15
  18. 16
  19. 17
  20. 18
  21. 19
  22. ================
  23. 18
  24. 19
  25.  

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: c++ atomic Verwirrung
BeitragVerfasst: Mi Feb 03, 2016 09:20 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
In enqueue ist dein "nil" static. compare_exchange_strong überschreibt sein erstes Argument ("expected") mit dem tatsächlichen Wert, wenn der Vergleich fehlschlägt. Durch static überlebt dieser Wert die Funktionsaufrufe und dann tut "nil" nicht mehr das, was du willst. Einfach das static wegräumen.

viele Grüße,
Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: c++ atomic Verwirrung
BeitragVerfasst: Mi Feb 03, 2016 10:29 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Oh Tatsache, da haette wohl ein gewisser jemand die freundliche Anleitung besser lesen sollen :)

Danke fuer deine Muehe

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: c++ atomic Verwirrung
BeitragVerfasst: Fr Feb 05, 2016 09:31 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2621
Wohnort: Berlin
Programmiersprache: Go, C/C++
Ich kann dir nur empfehlen die Atomic API von Windows, GCC zu nutzen, statt die vom c++ Standard.
Der Standard nutzt intern oft die System API und wenn mal wer optimiert hat dann sind es sehr umfangreiche Codefetzen, mit unzähligen Checks(macht es wieder lahm), die low level gehen.

Wenn du die wegen Performance nutzt, dann eher keine Standard C/C++ Bibliothek verwenden.
Die Idee von STL ist z.B. auch nicht Performance oder wenig Code zu schreiben, sondern flexibilität und somit komplexe Aufgaben schnell zu programmieren.
Bei youtube gibt es ein Video zu Optimierung von C++ in Spielen, auf einer C++ Konferenz.
Die STL und C++ Standard Designer und Entwickler hätten ihn gerne durch den raum geschleift, als er erklärte wie unglaublich mies der Code Performt und wieviel Resourcen die fressen, im vergleich zu optimierten Algorithmen.
Er hatte schlicht nicht gewusst, das dieser Code nicht sein Anwendungsziel abdeckt und haben diverse Beispiele gebracht wo es eigentlich eingesetzt wird.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: c++ atomic Verwirrung
BeitragVerfasst: Fr Feb 05, 2016 13:36 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Ja hatten wir tatsächlich auch im Prototypen über die plattformspezifischen Sachen gearbeitet. Nur haben wir dann festgestellt das viele Zielsysteme garnicht erst Multithreading unterstützen. Von daher wollte ich da jetzt nur 1 IFDEF lassen. Performance ist auf so alten Kisten ja auch egal, da es immer langsam bleiben wird lol

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: c++ atomic Verwirrung
BeitragVerfasst: Do Feb 18, 2016 11:41 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jan 28, 2016 09:42
Beiträge: 7
Programmiersprache: Delphi, C++
TAK2004 hat geschrieben:
Ich kann dir nur empfehlen die Atomic API von Windows, GCC zu nutzen, statt die vom c++ Standard.
Der Standard nutzt intern oft die System API und wenn mal wer optimiert hat dann sind es sehr umfangreiche Codefetzen, mit unzähligen Checks(macht es wieder lahm), die low level gehen.

Wenn du die wegen Performance nutzt, dann eher keine Standard C/C++ Bibliothek verwenden.
Die Idee von STL ist z.B. auch nicht Performance oder wenig Code zu schreiben, sondern flexibilität und somit komplexe Aufgaben schnell zu programmieren.
Bei youtube gibt es ein Video zu Optimierung von C++ in Spielen, auf einer C++ Konferenz.
Die STL und C++ Standard Designer und Entwickler hätten ihn gerne durch den raum geschleift, als er erklärte wie unglaublich mies der Code Performt und wieviel Resourcen die fressen, im vergleich zu optimierten Algorithmen.
Er hatte schlicht nicht gewusst, das dieser Code nicht sein Anwendungsziel abdeckt und haben diverse Beispiele gebracht wo es eigentlich eingesetzt wird.


Hast du mal einen Link zu dem Video? :0
Klar man muss auf jeden Fall wissen was das Ziel grade ist.

_________________
Give a man a program, frustrate him for a day.
Teach a man to program, frustrate him for a lifetime. :twisted:
- Waseem Latif


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: c++ atomic Verwirrung
BeitragVerfasst: Do Feb 18, 2016 12:02 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2621
Wohnort: Berlin
Programmiersprache: Go, C/C++
Zum glück wusste ich noch, dass es von einer cppcon war und konnte das Video recht schnell finden, weil ich mich an das Hawaihemd erinnert hab 8)

Unabhängig, dass er STL missverstanden hat ist der vortrag unglaublich informative und nützlich.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: c++ atomic Verwirrung
BeitragVerfasst: Mi Feb 24, 2016 09:13 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jan 28, 2016 09:42
Beiträge: 7
Programmiersprache: Delphi, C++
TAK2004 hat geschrieben:
Zum glück wusste ich noch, dass es von einer cppcon war und konnte das Video recht schnell finden, weil ich mich an das Hawaihemd erinnert hab 8)

Unabhängig, dass er STL missverstanden hat ist der vortrag unglaublich informative und nützlich.


Das Puzzle Hemd hat aber auch was :roll: Mit dem roten Hawaiihemd würde er sich irgendwie auch gut als Anbieter von Familienurlauben eignen :) Vielleicht könnte er sich eine family domain sichern (sowas hier meine ich) und das als Nebengewerbe machen. Den Vortrag muss ich mir nachher mal komplett anhören, danke! Der Anfang klingt auf jeden Fall schon mal gut :idea: 8)

_________________
Give a man a program, frustrate him for a day.
Teach a man to program, frustrate him for a lifetime. :twisted:
- Waseem Latif


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 25 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.035s | 17 Queries | GZIP : On ]