Frage

Ich verstehe die Hauptfunktion des Schlosses Schlüsselwort von MSDN

  

Lock-Anweisung (C # Referenz)

     

Das Schloss Schlüsselwort markiert eine Aussage   Block als kritischer Abschnitt durch   Erhalten des gegenseitigen Exklusionssperre   für ein bestimmtes Objekt, eine Ausführung   Anweisung, und dann die Freigabe des   sperren.

Wann sollte die Sperre verwendet werden?

Zum Beispiel macht es Sinn, mit Multi-Threaded-Anwendungen, da sie die Daten schützen. Aber ist es dann erforderlich, wenn die Anwendung alle anderen Threads nicht ausgliedern?

Gibt es Performance-Probleme mit Schloss mit?

Ich habe geerbt nur eine Anwendung, die Sperre überall verwendet, und es ist Single-Threaded und ich möchte wissen, sollte ich lasse sie in, sie sind sogar notwendig?

Bitte beachten Sie dies eher eine allgemeine Wissensfrage ist, die Anwendungsgeschwindigkeit ist in Ordnung, ich möchte wissen, ob das ein gutes Design-Muster in der Zukunft zu folgen ist, oder sollte dies vermieden werden, wenn es unbedingt erforderlich ist.

War es hilfreich?

Lösung

  

Wann sollte die Sperre verwendet werden?

Eine Sperre soll gemeinsam genutzte Ressourcen verwendet wird, in multithreaded Code zu schützen. Nicht für irgendetwas anderes.

  

Aber ist es notwendig, wenn die Anwendung ausgliedern keine anderen Themen?

Absolut nicht. Es ist nur eine Zeitverschwendung. Jedoch seien Sie sicher, dass Sie nicht implizit System-Threads verwenden. Wenn Sie zum Beispiel asynchrone mich / O Sie Rückrufe von einem zufälligen Thread empfangen können, nicht die ursprünglichen Thread.

  

Gibt es Performance-Probleme mit Schloss mit?

Ja. Sie sind nicht sehr groß, in einer Singlethread-Anwendung, aber warum telefonieren Sie nicht brauchen?

  

... wenn das ein gutes Design-Muster ist in der Zukunft folgen [?]

Sperren alles nolens volens ist ein schreckliches Design-Muster. Wenn Ihr Code mit zufälligen Sperrladen und dann einen Hintergrund-Thread für einige Arbeit nutzen Sie entscheiden, sind Sie wahrscheinlich in Deadlocks laufen. Gemeinsame Nutzung einer Ressource zwischen mehreren Threads erfordert sorgfältige Planung und desto mehr können Sie das schwierige Teil ist, desto besser isolieren.

Andere Tipps

die Antworten hier scheinen In Ordnung: Schlösser Nützlichkeit ist Fäden zu blockieren von acessing gleichzeitig gesperrt Code. Allerdings gibt es viele Feinheiten in diesem Gebiet, von denen eine ist, dass gesperrte Codeblocks werden als kritische Bereiche automatisch markiert von der Common Language Runtime.

Die Wirkung von Code als kritisch markiert wird, ist, dass, wenn die gesamte Region nicht vollständig ausgeführt werden kann, kann die Laufzeit berücksichtigt, dass Ihre gesamte Anwendungsdomäne ist potenziell gefährdet und daher entladen es aus dem Speicher. Um Zitat dieser Artikel auf die Gefahren der Thread.Abort ()

Beachten Sie, dass es vielleicht Gründe, warum Ihre Anwendung nicht als Single-Thread ist, wie Sie denken. Async I / O in .NET kann auch auf einem Pool Thread Call-Back, zum Beispiel, wie auch einige der verschiedenen Timer-Klassen (nicht die Windows Forms-Timer, obwohl).

Allgemein gesprochen, wenn Ihre Anwendung Single-Threaded ist, dass Sie nicht gehen zu viel Gebrauch aus dem Schloss Aussage. Nicht zu wissen, Ihre Anwendung genau, ich weiß nicht, ob sie nützlich sind oder nicht - aber ich vermute nicht. Wenn Sie darüber hinaus Anwendung sind Sperre verwendet überall weiß ich nicht, dass ich sowieso in einer Multi-Threaded-Umgebung um daran zu arbeiten alles, was sich sicher fühlen würde - die Original-Entwickler haben wirklich wissen, wie zu entwickeln Code mit mehreren Threads, oder haben sie nur hinzufügen Schloss Aussagen überall in der vagen Hoffnung, dass der Trick tun würde?

Schloss sollte um den Code verwendet werden, die freigegebenen Zustand ändert, Zustand, das gleichzeitig von anderen Threads geändert wird, und die anderen Stufen müssen die gleiche Sperre nehmen.

Eine Sperre ist tatsächlich ein Speicherzugriff Serializer, die Fäden (dass das Schloss nehmen) auf die Sperre wartet, einzutreten, bis der aktuelle Thread die Sperre austritt, so dass die Speicherzugriffs serialisiert wird.

Zur Beantwortung Sie Frage Sperre nicht in einem einzigen Thread-Anwendung benötigt wird, und es tut Performance Nebenwirkungen haben. weil Schlösser in C # auf Kernel-Sync-Objekte basieren und jedes Schloss nehmen Sie erzeugt einen Übergangsmodus vom Benutzermodus an den Kernel.

Wenn Sie Interesse an Multithreading Performance einen guten Platz zu starten, ist MSDN Einfädeln Richtlinien

Sie können haben Performance-Probleme mit Variablen sperren, aber in der Regel, dann würden Sie Ihren Code konstruieren, um die Längen der Zeit zu minimieren, die in einem ‚gesperrt‘ Codeblock ausgegeben werden.

Soweit die Schlösser zu entfernen. Es wird davon abhängen, was genau der Code tut. Auch wenn es Single-Threaded ist, wenn Ihr Objekt als Singleton implementiert ist, ist es möglich, dass Sie mehrere Clients eine Instanz davon (im Speicher auf einem Server) haben werden zur gleichen Zeit ..

Ja, es wird eine Leistungseinbuße, wenn Schloss, aber es ist in der Regel vernachlässigbare genug, um keine Rolle.

Mit Sperren (oder jede andere gegenseitige Ausschlusserklärung oder konstruieren) benötigt im Allgemeinen nur in Szenarien mit mehreren Threads in denen mehrere Threads (entweder Ihrer eigenen machen oder von Ihrem Anrufer) die Möglichkeit haben, mit dem Objekt zu interagieren und ändern Sie die zugrundeliegenden Zustand oder Daten gehalten. Zum Beispiel, wenn Sie eine Sammlung, die von mehreren Threads zugegriffen werden kann, wollen Sie nicht ein Thread den Inhalt dieser Sammlung zu ändern, indem ein Element entfernt wird, während ein anderer Thread, es zu lesen versucht.

Sperren (Token) wird nur verwendet, um einen oder mehrere Codeblöcke zu markieren, die nicht gleichzeitig in mehreren Threads ausgeführt werden soll. Wenn Ihre Anwendung single-threaded ist, ist es zum Schutz gegen eine Erkrankung, die nicht existieren kann.

Und Verriegelung hat eine Leistung getroffen aufrufen, Hinzufügen von Anweisungen für den gleichzeitigen Zugriff zu überprüfen, bevor der Code ausgeführt wird. Es sollte nur verwendet werden, wenn notwendig.

Sehen Sie die Frage zu 'Mutex' in C #. Und dann unter diesem two Fragen zur Nutzung des 'lock (Object)' Anweisung spezifisch.

Es gibt keinen Punkt Sperre in der App in mit, wenn es nur einen Thread ist und ja, es ist eine Performance-Einbußen, obwohl es eine angemessene Anzahl der Anrufe nimmt für das Hit signifikant in etwas zu stapeln.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top