Multithreading in C++ [010] - Race Conditions Brotcrunsher https://www.youtube.com/watch?v=sfKihxVrjJA Transkript (automatisch erstellt) 0:00 halli hallo und dieser episode schauen wir uns mal an was denn da eigentlich passiert es in der letzten episode warum das so passiert ist die lösung wie wir 0:08 das ganze dann lösen können das können wir uns in der nächsten episode an und zwar handelt es sich bei beidem und sogenannte race conditions das sind 0:17 negative effekte die man bei wenn man nicht aufpasst beim multi threading auf jeden fall haben kann gucken wir uns das erste beispiel mal an 0:26 also wir haben oben dieses intervall es gleich null und haben hier eine schleife weil wall kleiner 400.000 wird dieses mal eben in kommentiert so so sieht es 0:36 aber eigentlich wenn wir es dann ausführen ja gar nicht aus in wirklichkeit haben wir davon 16 stück ich zeichne hier jetzt einfach mal nur 0:45 zwei stück hin und wenn wir jetzt das mal genauer angucken dann in kommentieren die schön fröhlich vor miteinander hier die zahl hoch und 0:55 irgendwann hat diese dieses value da oben zb 99 1999 also diesen wert und dann überprüfen beides reds hier ist wohl kleiner 100.000 und beide kommen zu 1:09 dem schluss ja es ist kleiner als 100000 also in kommentieren beide einfach den fährt und dann kommen wir hier auf 100.000 1 also ein update zu viel 1:22 das ist natürlich jetzt erstmal ein problem wir müssten also irgendeine möglichkeit finden dass sich verschiedene sets wie 1:31 das synchronisieren können und dass sie wirklich beide den gleichen wert in kommentieren oder irgendwie lesen aber dass gleichzeitig im nah geht es ganz 1:42 genau im detail funktioniert gucken wir uns dann wie gesagt in der nächsten episode an da geht es dann um so genannte mew texas 1:48 und das ist dann die lösung für dieses problem jetzt ist dieser effekt aber auch natürlich nicht immer so also manchmal haben wir ja das letzte mal 1:56 gesehen ist es auch wirklich 100000 also genau dies das was wir haben wollen und wenn es so abhängig ist in welcher reihenfolge des rats laufen was wir ja 2:05 nicht steuern können direkt dann spricht man von einer race condition also in welcher reihenfolge etwas es kann auch race conditions in 2:14 programmen geben die jetzt nicht wirklich schlimm sind wenn man zum beispiel auf eine kuh irgendwas drauf pusht dann kann es manchmal egal sein ob 2:22 erste eines red pusht und dann der andere oder andersrum ja das kommt dann auf konkrete problem an 2:28 wenn man zum beispiel eine kuh macht was noch alles abgearbeitet werden muss von irgendeinem anderen worker fred dann ist es meistens egal in welcher reihenfolge 2:35 da zwei tags darauf landen muss aber nicht sein also auch das kann man für probleme sorgen kommt eben wie gesagt auf das detail dann aber wenn wir jetzt 2:44 hier von race condition sprechen innerhalb von dieser serie dann meine ich damit immer negative race conditions also etwas was man nicht haben möchte 2:53 in so einem programm das nächste beispiel das war aber ja noch ein bisschen krasser hier haben wir ja diese vor schleife in die gleich null und 3:01 kleiner 10.000 und das haben wir dann in zehn tracks gestartet und da kam dann nicht hunderttausend raus sondern es kam nur 33.000 euro beziehungsweise ich 3:13 glaube es fehlt jetzt eine null aber ja der effekt ist der gleiche das liegt daran dass dieses wall + + also dieses implementieren von wall ist 3:22 gar nicht so harmlos und kleiner mini befehl wie man zunächst vielleicht denken mag sondern dieses wall besteht eigentlich aus direkt drei befehlen also 3:31 das implementieren von wahl und zwar aus erstens lade den wert von weil wir momentan ist dann inkrementelle diesen wert also erhöhen um 1 und dann schreibt 3:43 diesen wert wieder zurück in wald und da mal genau das problem sagen wir mal ganz am anfang sind alle trades also die stadt einmal alle exakt 3:52 gleichzeitig dass es da ein bisschen unrealistisch aber sagen wir mal sie starten alle gleichzeitig dann laden die ja alle den wert 0 rein dann erhöhen sie 4:04 alle auf wert 1 und dann schreiben sie alle den wert 1 zurück das heißt jeder von diesen trends eigentlich sollte jetzt zehn rauskommen aber jeder von 4:14 diesen fritz hat auf 1 erhöht und es kann sogar noch schlimmer sein wenn ein schreibt bereits zum beispiel bei 1000 ist dann will er eigentlich um 1 erhöhen 4:22 auf 1001 und jetzt fängt erst anderes red an ja er hat zum beispiel den wert schon gelesen als er hat schon ein bisschen davor angefangen er hat 4:33 schon den wert null ganz am anfang gelesen in kommentierten um 1 und ist jetzt plötzlich wieder bei 1 also es kann sogar sein dass wieder 4:41 zurückgegangen wird weil ein anderer fred noch nicht so weit war ja und da spricht man dann von sogenannten lost updates lost updates sind auch wieder 4:51 race conditions aber eben eine besondere art von race condition so das was ich gerade er erzählt habe mit diesen drei schritten was so ein instrument 4:59 eigentlich ist wird noch verstärkt zusätzlich durch eine andere optimierung von cpu es die uns bei multi threading aber einen strich durch die rechnung 5:10 macht und zwar kann eine cpu sagen dass diese beiden schritte von diesem inkrementell nicht immer ausgeführt werden sollen 5:19 zum beispiel kann sie sagen okay am anfang wird 0 geladen und dann mache ich sechzehn mal den schritt 2 also in kommentiere diesen wert 16 mal um 5:29 jeweils 1 wenn er dazu bei 16 und erst dann schreibe ich wieder zurück und solange in dieser zwischenzeit habe ich das nur noch nicht wieder zurück in den 5:37 arbeitsspeicher geschrieben sondern habe das ganze noch im cache das ist ein zusätzlicher speicher der jetzt nicht im arbeitsspeicher ist sondern noch näher 5:46 an der cpu noch schneller deswegen ist es eine optimierung eigentlich bei single threaded macht es uns auch überhaupt keine probleme dass 5:54 es eben nicht direkt immer alles zurück schreibt sondern es behält das ganze eventuell noch im cache und arbeitet dort damit weiter ohne es zurück zu 6:01 schreiben in den arbeit ba aber wenn wir jetzt mit multi threading arbeiten dann haben wir da ein problem denn jetzt ist es eben so dass der dieses was wir nicht 6:12 zurück geschrieben haben nicht gelesen werden kann von den anderen fans sondern nur von einem verlag der es ursprünglich eben hat und noch nicht zurück 6:21 geschrieben hat so und das sind race konditions und wie man die beheben wie gesagt guck man es jetzt gleich in der nächsten episode an