[Playlisten] [Impressum und Datenschutzerklärung]

09.4 Synchronisation von Threads, lock


CC-BY-NC-SA 3.0

Tempo:

Anklickbares Transkript:

ich hatte versprochen das immer was Besseres zeige als volle Teil beurteilt die rustikale Methodefür Mikroprozessoreneinenin den modernen Sprachen hat mantypischerweise etwas anderesin Javaschreibt und singt von Eis und insie sharp schreibt man noch das will ich einmalvorführen wie das aussieht am Beispielwar das auch wirklich sehen dass das nötig ist das zu tunund zwar angenommen ich habe zwei Threadsmit einsmitzweiunddiese beiden Threads teilen sich eine Variablesicher eben mit den Variablen zum Beispiel zum Starten und zum stoppen die meinen beidengemeinsamdie Variable würde ich dann alsovolle Teil machen es nicht andersgeregelt kriegemit kompetenten Geschichten oder moderneren Geschichteninder Job das Fett soll sein diese Variable um eins zu erhöhen stellt es vor wie einErzähler jeder Zähler jederzeitzähltähmwie viel Arbeitsschutz er gerade erledigt hat je Kilowattstundegeradebewegte Deutschtümelei benachrichtigt würde ebensoder jeder Thread soll zählengemeinsam in dieser Variable das danach in der Variablender gesamte Zählerstandsteht nicht ein Zählerstandprozweiten Charme gemeinsameVariablenicht ein Zählerstandpro Fett sondern ein gemeinsamerZählerstandwenn alles mit rechten Dingen zugehtüber Liechtenstein irgendwann der erste Threads dass es jetzt so weit wäre diese Zahl zu erhöhen erließ die dreizehnerließ die dreizehnaddiert eins draufkriegt vierzehn rausschreibt das zurückund dann stellt gleich der zwei irgendwann fest Punkt jetzt ist aberder Zähler als weiter zu stellen erließ die vierzehnaddiert eins drauf kriegt fünfzehn raus und schreibt die fünfzehn zurückdas wäre der Idealfalleiner so passiertist die Welt in Ordnung und endlich wunderschön auch mit dem weiterhinder Ärger istes kann schief gehen jedessoundso hundertste tausend der zehn tausendsten Mal wird das schief gehen dass es auch wieder eine ganz blöde Fehlerquellewas es überhauptganz dringendes Thema bei bei dem altes Wedding an sie können sichgrandiose Fehler einbauender Meßfeier später auftreten weil irgendein Kunde dann plötzlich mit sechzehn kein Rechner ankommtund die vorher nie auf seiner Maschine gesehen habenmuss sehr vorsichtig sein ?? programmiert das sachkundiges Thema in der Informatiküberlegen ganz viele Leutewie man das denn sicher hinkriegen kanndas mal des Ringan die man solche Fehler grundsätzlich vermeiden kann dieses Parterre voraus zum Beispiel eine ganz einfache Idee solche Fehlergrundsätzlicher Weise schonbisschenwahr einzuschränkennicht totalbisschenokay das wäre die Wunschsituationjederzeit zählt als hochzum Schluss wieder fünfzehn zwei mehr??jetzt kann aber sein dass die beiden sich gleichzeitigüberlegen das Variable erhöht werden mussund dann passiert BlödsinnMesse Schaubild für die Nummer achtalle glauben dasselbe zu tun und plötzlich passiert nütze ich habeeinsich habe zweiich habe eine gemeinsam genutzte variablevariabledie steht zu Beginn von mir aus auf dreizehnder erstes Weltsagt sich irgendwann oh ja ich muss jetzt mal um eins weiter schaltenschreibtseine vierzehn zurückdas kann ihn passierendas der zweite Thread nicht häufig aber irgendwann wird es passierendass der zweite dritten gleichen Moment sagt pro Zimmer hier bitte von der dreizehnten Scheiben ein zweiter ?? auf dievierzehnund das wäre natürlichblödsinnigsie hätten sich wirklichbezeichnet ?? sollte sie noch klarmachendann ist das im zeitlichen Ablauf noch mal klarmachenda bleibt immer noch die dreizehn drin stehenund jetzt auch der zweite Thread während der erste gerade addiert das G zwei schnell aber es geht nichtin unendlich kurzer Zeitwährend der erste addiert sagt der zweite ruhig weiter stellenund schreibt dann hier noch malvierzehn seinklarvon der Struktur her das heißtwenn die beiden sich nicht abstimmen beim Zugriff auf diese Variablehabe ich irgendwann Einzellervergessen und zum Schluss leicht Hunderte oder Tausende Zähler vergessendurch diesen Effektich weiß wohl auch gar nicht wie viel ich vergessen haben werdeandas hängt von der Maschine abvon den äußeren Umständenwie viel jetzt zwischendurch passierteine drei Stunden rechnet und dann einmal zwischendurchein zweiter zählt ist das Thema nicht so gravierend als wenn er ständig weiter zählt jedevon mir ausdrei hundert neunzig und zehn Nanosekunden weiter zählt dann ist das Entwicklungsproblemals die nach äußeren unter Umständenpassiert das hier häufigerseltener oder gar nicht auf jeden Fall gefährlich das darf nicht das ?? auch nicht theoretischpassieren muss sicherstellen dass dieses nicht mal theoretisch passierenwenn sie nur mit Wolle Teil arbeitenwird das irgendwann passierenalso wenn's nur das ?? eben eine Wartung geht eine Variable auslesen eine Variable setzenokay aber sobald es jetzt allein das vermisst eine Variable um eins erhöhenlaufe ich Gefahrdas was schiefgeht ?? auch eine Synchronisierungzwischen den Fans die müssen sich abstimmenbeim Zugriffauf die Variablendas Zeichen mal wie das aussehen kannauch erst malzwei Threads die irgendwelche Arbeiten machen dazu wie üblicheine Methode die Arbeit erledigt du Workklären können egalsie könneGänsefüßchen untenüblich bissechs hundert zehn Millionen zehn Millionen ?? aus Oswald Simion ein zwei dreidreianichbrauche diese Variable?? sechs hundert neun ich brauche diese Variante die hoch gezählt wird natürlichmachen die auch ganzordentlich wolle Teildes FCK nichtselten etwas aber das macht es ?? nicht korrektwarenMemberSie Teil ähmKommaZählerzonensehenund jetzt sehe ich einfach diesen ZählerPlatzeins raufsind es sieht so aus wie ein Befehl ist aber ?? ein C++heißt der den alten Wert lesenund dannum eins erhöhenund dann wieder zurückschreibendas ist nicht streng genommen ein Befehl ist nicht atomar wie man so schön sagt es ist nicht atomar sondern das wird nach in einzelnen Schritten ausgeführt dass es nicht ein einzigerSchrittdeshalb gibt's ja gerade diesen Ärgers ist das hierdas eine ?? dazwischen funken kannsoll wenn ich fertig bin möchte ich einfach ausgebenhier was den Zähler stehendzu machen??Klammer zuins System diagnostiziert??jederzeitgezählt gibt ausWasser den als letzten Wert gesehen hat in CaesarsDiagnosticsdasneueeinTrainersodas ist die Methode diese Methode soll es von zwei Threads parallel ausgeführt werdenbeide machen denselben Jobmit derselben Variante zähle er keine Angst dieses integrieren sie nicht gemeinsam die lokalen Variablenhat jeder Thread für sich als jeder zu jeder Zeit hat dann sein eigenes wiediese Methode wird ja aufgerufenund damit wird automatischeine neue kopier für die Variable I angelegt aber das hat jederzeit alleine was in lokalen Variablen haben der Zählergemeinsambeideerhöhen den selben Zähler gleich zweiundvierzigjetzt noch Raum digitalisiertalso was soeben hatten sie sich bei den Observanzdes Firmenwertswar mein erster Felsneuer Absatzüberraschend und du wirst machenmachennunhoffentlich mehr sieht Shell stell ich mal wieder aufsosieHorstum und starrte ihnmiteuch noch in zweiten?? ist der genau dasselbe machtdas heißt diese Teamworkmethodeläuftan zwei Stellen gleichzeitigzwei Arbeiter machen dasselbenichtwas wesentlich ist das aber mitzählen wie häufig sie was machen Sie hiermitzum Schlusssollte hier sind ja beide werdenersetzt Semikolon mal beide werden zehn Million mal ausgeführt jederzeitläuft zehn Millionen males heißt in Zähler sollte zum Schluss zwanzig Millionen stehenbei jedem Mal erhöhen wird um einzelnen Zähler sollten zwanzig Millionen stehenamStandort in China Beistrich ausprobiert mir zu Hause stehen nicht zwanzig Millionenist auf dieser Maschine kommtAugein dieser Maschine stehen siebzehn Millionen?? schaffen wir das Problem dann an der Stelle etwas klardass sie total harmlos und das es noch mal machenet ceterasicher weiter gehtdaswahrscheinlich nicht das Doppelte sollte vielleicht einmalauf null setzen die Werte besser vergleichenetwa zu Beginn auf nur hierist der Zähler ist der zehn Kommanull bevor ich das neu machen zuvergleichenokay also der erste Thread hat irgendwie aufgehört ?? fünfzehn Millionen bei der fertig und dann müsste der nächste ja noch bis zwanzig Million Weiterzählenangesehen über fünfzehn Millionen acht hundert irgendwassehr malder erste in über dreizehn Millionen?? weiter zählen etwa siebzehn Million desPaktes zu Fall wo sie dann je nachdem wie diese Befehle kommenverhaken die sich nicht vertragen sich nicht oder verhaken sichandas für ein genialer ZufallszahlengeneratorhieramLeerschritt etwas zu genial aberdas kann der Zufallszahlengeneratorverwendet es kommt nicht zwanzig Millionen raus wenn das ordentlich funktionieren würdezwei Threads zählenvonnull bis neun?? wird von null bis neun Millionen neunzehn tausend hundert neunzig den Zusammenschlussauf zwanzig Millionen stehen steht es aber nicht ?? und das heißtes ist weniger das passiert genau das was ich hier geschrieben habe das passiertgar nicht genau vorhersagen wann es passiert wie häufig es passiert ?? es wird irgendwann passieren ist es ganzbesonders drastischen diesem Beispielanals Warnhinweis Vorsicht wenn wenn sich mehrere Threads miteinander unterhalten muss man dafür sorgen dass diese Zugriffe irgendwie koordiniert werden Synchronisationaneinem echten Informatikstudiumbescheinigt zwei Semester was zu erzählen ich wollte ging es mir nur Ringen als Problem gesehen bewusst ist was ist ein ?? das Problem was ganz neues Netz zu bauen ist nicht das Problem das Problem ist jetzt miteinander reden zu lassenund das scheint so wohl nicht zu funktionierenandie Lösung mach ich das jetzt hier maldas alles miteinanderbeschreibt die Nummer zehn mal dreist dazwischenin Java ist die Lösung mit einer Entarist die Lösung mit einemSchuss über das asynchrone ?? inein sie schadhaftesLokabschließenbenutze einzusätzlichesObjektum diese Zugriffe zu synchronisierendass es in beiden Sprachendie Idee auf ein weiteres Objekt für denKomma zehn??das kann irgendwas sein ??manchmal bietet sich an irgendeines Objekte zu nehmen die man schon hateine Liste die man eingerichtet hateinen Namenein bestimmter Gegenstand der sowieso in der Gegend rumfliegtrichtiges einfaches neues reindieses Objektdient nur dazusich zu merkenob gerade jemand etwas kritisches tut mit meiner Variablender Formirgendein Objektwas ich benutzen kannund dieses Objektdas es damithabenob der ist das grundlegendeObjekt für eine grundlegende Klasse von alldiesen damit bitte ich nun Phase sich zu merken ob jemand anders schon was problematischestut wenn das der Fall ist muss ich wartenKommadas kommt hier rumlagdamitdarumherumbevorich oder solange sich auf den Gesichtern solange so lange wie ich auf diese gemeinsame Variable zugreifenhabensich das alles in dieses Loch reinwas das bedeuten soll ?? selber mach ich in dem anderen Threadan der Stellean der Stelle das nicht wirklich aber zu konsequentan der Stelle läuft der keiner von den anderen Threads aber ich hatte trotzdem reinder ordnunghalberHahnso sind jetzt alle Zugriffe auf diese gemeinsame Variable eingebettetin dieses Lokwas nun passiert ist folgendeswenn ein Thread hier ankommtguckt erob sich dieses Damenobjektgemerkt hatdass das schon jemand reingegangen ist ob jemand das Schloss aufgemachtwenn schon jemand reingegangen ist so ein Bereichmuss jeder der danach kommt wartende bleibt hierbei den Block stehenbis denn der darin es wieder rausgegangenist?? Telefonhäuschenmich mit ?? nachdenkenBeistrich Telefonhäuschenlokihres billigen Telefonhauseskann nur eine Person zu einer Zeit drin seinBeistrich damit wir zum TelefonhäuschenamEnde einer drin es müssen alle anderendraußen warten wenn der erste Thread hier drinnen ist unser zweites getreten nur die beiden ?? der Stelle zu greifen ist der zweite draußen war der erste seit rausgehtder sicher reingehenund drinarbeitendesheißes Plus Pluswird höchstens von einem Thread zu einer Zeit ausgeführtinsgesamtbekannt ganz weiterrein funkenandas ist die übliche Art der Synchronisationbrauchen Objektdas eigentlich nurdazu da ist um sich zu merkenob jemand da drin ist in so einem Bereich und alle diese Bereiche jetzt mit Dame hiergelockt sind in all diesen Bereichen zusammen darf immer nur ein einziger Thread steht oder keines Komma das kratzt keiner an den Stellen istin einer ?? Drogen drin isthat es mit derselben Variabilitätweist der damit aus einer trennenden darf auch hier unten keine rein und alle müssen vor dem Block warten und erst wenn ich oben ausgehtdürfen die auch unten wieder reinwickeltedich mehr machen als Luxusbussekönnte zwischendurch auch?? Datei auf machender Datenbankabfragenum sicherzustellendass der ganze Bereichder gesetzlichen hat das dann nicht ein kritischer Abschnitt für die Gesellschaft dass dieser ganze Bereich geschützt ist insofern als dass nur ein Threadzu einer Zeit darin arbeiten darfund mit dem Lok geht also noch weit es ist nicht unser Bereich geschützt sondern alles was denselben Dammjagdist insgesamt geschützter Daten Eintritt zu einer Zeit drinstehenallemkann ich ?? das volle Teil auch noch loswerden ?? in dieser Rolle teilsantik das braucht man dann nicht mehr mit demdem Loksorgt der Compiler dafür dass das auch funktioniert sie Punkt es wurde dann später vorzuschreibenähmdas sagten des Logs Compiler nebenbei dazu bestimmte Sache nicht um sortieren darf dass bestimmte SachenAußenspeicherungmuss in den Speicher schreiben muss es fusioniert von selbst richtig mit gar nicht wieder erkennen Stunden verwendendrum haben funktioniert von selbst?? das volle Teil nicht mehr das volle Teil ist wie gesagt eher was fürdie klassischen Mikroprozessorensodas man wenige Änderungen ich hab dir einfach um alle Zugriffe des Blog geschriebenund da lassen Kommaundich habe dieses Objekt damit eingerichtetdas ich merktder Abgabe einer drin istund ich bin das wollte also noch losgewordenjetzt müssten noch nicht zwanzig Millionen ausTransmissionPunkt das eigentlich auch wiederholbardarüberzwanzig Million Sie nebenbei der erste Threadendet früher als der zweite der erste Thread sieht nur fünfzehn Million und dann zählt der nächste Thread noch bis zu seinemEnde des ?? wissen aber es ist die Anzeige bei dem ersten Thread immer so verschiedenwichtig ist das die Summe von beiden stimmtjeder Thread muss zehn Millionen Mal laufen in der Summe müssen zwei zwanzig Millionen sein so funktioniert es ?? das ist die billigste Art wie man sie Situation lösen kannandas kann man endlos weiter treiben ich wollte ihn zumindest die wichtigste Art einmal gezeigt haben und das Problem gezeigt habenhaben Kommunikationsnetzist das schwierigste von einander stellen