Blubb blubb zu thread safety in der MSDN
-
http://msdn2.microsoft.com/en-us/library/system.data.dataset.aspx
Wie würdet ihr die folgende Aussage verstehen:
This type is safe for multithreaded read operations. You must synchronize any write operations.
Heißt das
(1) Während dem Lesen wird nichts an der Datenstruktur so verändert, dass nicht mehrere Threads lesen könnten; heißt also n reader, 0 writer gleichzeitig bzw. 1 writer gleichzeitig
(2) Während 1 Thread schreibt dürfen auch andere Threads gleichzeitig im DataSet lesen; heißt also n reader, 0-1 writer gleichzeitigIch tendiere ja eigentlich zu (1), weil es mehr dem Verhalten entspricht, mit dem ich regelmäßig Umgang habe. (2) könnte sowieso überhaupt nur schwer realisiert werden (allerdings nicht unmöglich), wäre aber in meinem Fall gerade furchtbar praktisch.
Die Formulierung finde ich aber komisch und verstehe sie schon fast so, dass man immer bedenkenlos lesen kann. Verstehe nur ich das so? Was meint ihr jetzt, was eher zutrifft?
-
wenn ich im Linux-Kernel-Handbuch das richtig verstanden habe könnte das folgendermasen aussehen:
(1) Während ein Writer schreibt dürfen keine Reader zugreifen, der Writer wartet bis alle Reader fertig sind oder
(2) Der Writer schreibt und die Reader prüfen ob zwischen begin und ende des Zugriffs ein Writer zugegriffen hat und wiederholen gegebenfals den Zugriff.Dürfte auch auf Windows übertragbar sein, läuft allerdings beides effektiv auf dein (1) hinaus, auch wenn mein (2) tatsächlich anders läuft
-
Gut, dein (2) könnte eine weitere Möglichkeit sein, wie das implementiert ist. Allerdings hab ich ehrlich gesagt schon meine Zweifel, ob das jetzt vom Linux Kernel - Handbuch übertragbar ist und schlussfolgern lässt, was es denn jetzt überhaupt ist. Es ist nämlich auch nicht die Frage, wie es denn jetzt in Windows ist, sonder wie konkret die Klasse DataSet implementiert ist und daran wäre ich jetzt interessiert.
-
Die Muster der Zugriffssicherung beim Parallel Procesising sind eigentlich ziemlich einheitlich, auch wenn die genaue Anwendung der Techniken deutlich variiert.
-
Die Formulierung ist äusserst unglücklich.
Ich gehe aber davon aus dass "N reader ODER 1 writer" gemeint ist. Sollte in der Tat "N reader + 1 writer" gemeint sein ist die Formulierung doppelt unglücklich, da ein wichtiges Feature quasi unterschlagen wird.
@Optimizer: taucht diese Formulierung öfters auf, oder nur bei dieser einen Klasse? Unabhängig davon könntest du aber MS anschreiben, dass die das fixen sollen bzw. klarstellen.
-
Sobald 1 Writer ("any write operations", d.h. >= 1) zugreift, muß man synchronisieren, d.h. braucht einen Interlock mit den Readern und anderen Writern. Solange es nur n Reader sind, ist kein Interlock notwendig.
Das steht doch da?

Die Variante (2) wird von "any write operations" verworfen.
-
hustbaer schrieb:
@Optimizer: taucht diese Formulierung öfters auf, oder nur bei dieser einen Klasse? Unabhängig davon könntest du aber MS anschreiben, dass die das fixen sollen bzw. klarstellen.
Ja, is einer von den möglichen Standard-Sätzen die sie da verwenden. Ich konnte aber keine zusammenfassende Seite über diese Sätze finden.
Marc++us schrieb:
Sobald 1 Writer ("any write operations", d.h. >= 1) zugreift, muß man synchronisieren, d.h. braucht einen Interlock mit den Readern und anderen Writern. Solange es nur n Reader sind, ist kein Interlock notwendig.
Das steht doch da?

Die Variante (2) wird von "any write operations" verworfen.
Also du vermutest gleichzeitig lesen und schreiben geht nicht. Und du vermutest es im speziellen deshalb, nicht weil es häufig einfach so ist, sondern weil du genau diesen Text so verstehst, oder? Alles klar, das wollte ich wissen.

Ich glaube es inzwischen auch, nicht nur weil es das offensichtlichere ist, sondern weil ich seltsame internal-index-corrupted Fehler habe. Ich hab mir gedacht, probieren geht über studieren.

Aber ich finde die Formulierung nicht genauso klar. So ist das Verhalten ja dann identisch mit der List<T>, da steht aber:
Public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.
A List can support multiple readers concurrently, as long as the collection is not modified.
Was ich mal wirklich eindeutig finde.
-

A List (Type) can support multiple readers concurrently, as long as the collection is not modified.
<=>
This type is safe for multithreaded read operations. You must synchronize any write operations.
Oder so:
can support <=> is safe
concurrently <=> multithreaded
multiple readers <=> read operations
as long as not modified <=> when write operations must do something (synchronize)
modified <=> write operationEntweder fehlt mir die Phantasie, oder ich lese das identisch.
-
Die Formulierung ist nicht eindeutig, da die Möglichkeit dass evtl. jmd lesen UND schreiben möchte nicht berücksichtigt wird -- bzw. es wird keine Aussage darüber getroffen was dann zu tun ist. Mit der nötigen Erfahrung lässt sich schnell erraten was wohl gemeint ist, rein aus sprachlicher Ebene ist das aber so unklar wie nur geht.
-
hustbaer schrieb:
Die Formulierung ist nicht eindeutig, da die Möglichkeit dass evtl. jmd lesen UND schreiben möchte nicht berücksichtigt wird
Doch. "any write operations" bedeutet >= 1. Damit wird ausgesagt, daß man synchronisieren muß, sobald mindestens 1 Write-Operation stattfindet, egal ob parallel zu anderen Write-Operations oder zu Read-Operations.
-
Marc++us schrieb:
hustbaer schrieb:
Die Formulierung ist nicht eindeutig, da die Möglichkeit dass evtl. jmd lesen UND schreiben möchte nicht berücksichtigt wird
Doch. "any write operations" bedeutet >= 1. Damit wird ausgesagt, daß man synchronisieren muß, sobald mindestens 1 Write-Operation stattfindet, egal ob parallel zu anderen Write-Operations oder zu Read-Operations.
Nein, das wird damit nicht ausgesagt. Ich weiss nicht wie du das da hineindeuten willst, es steht aber auf jeden Fall nicht da. Was du schreibst würde zutreffen wenn da "you must synchronize read and write operations if there can be any write operations" stehen würde. Da steht aber nur "you must synchronize write operations" - also ich muss Schreibzugriffe synchronisieren. Nirgends steht aber dass ich Lesezugriffe auch mit Schreibzugriffen synchronisieren muss. Und sag jetzt bitte nicht "das ist logisch" - klar isses logisch wenn man weiss wie sowas normalerweise geht, aber es steht eben nicht dort.
Davon abgesehen ist jede Formulierung die nicht für einen Grossteil aller potentiellen Leser eindeutig verständlich ist schlecht, im Sinn von ungünstig. Ganz egal ob sie nun technisch gesehen korrekt ist oder nicht (und ich bestreite immer noch dass sei das ist).
-
hustbaer schrieb:
Marc++us schrieb:
hustbaer schrieb:
Die Formulierung ist nicht eindeutig, da die Möglichkeit dass evtl. jmd lesen UND schreiben möchte nicht berücksichtigt wird
Doch. "any write operations" bedeutet >= 1. Damit wird ausgesagt, daß man synchronisieren muß, sobald mindestens 1 Write-Operation stattfindet, egal ob parallel zu anderen Write-Operations oder zu Read-Operations.
Nein, das wird damit nicht ausgesagt. Ich weiss nicht wie du das da hineindeuten willst, es steht aber auf jeden Fall nicht da. Was du schreibst würde zutreffen wenn da "you must synchronize read and write operations if there can be any write operations" stehen würde. Da steht aber nur "you must synchronize write operations" - also ich muss Schreibzugriffe synchronisieren. Nirgends steht aber dass ich Lesezugriffe auch mit Schreibzugriffen synchronisieren muss.
Ich verstehe es genauso wie Marc++us und finde auch, dass die Aussage recht eindeutig ist.
"any write operations" ist eine generalisierte Aussage und schließt alles ein, wo mindestens ein write dabei ist.
-
Die Frage ist nicht wie man "any write operations" versteht, sondern es ist eine Frage der Grammatik.
"you must synchronize any write operations" -> "synchronize write operations" - das "synchronize" bezieht sich NUR auf "write operations". Dieser Satz besagt NICHT dass ich auch "read operations" "synchronize"-en muss.
Alleine das die Frage hier gestellt wurde beweist ja wohl dass die Formulierung NICHT eindeutig bzw. klar verständlich ist.
Weiters ist das Wort "synchronize" sowieso etwas schwammig - "synchronize" kann vieles heissen. Es könnte z.B. genauso gemeint sein dass alle Zugriffe gleichzeitig erfolgen müssen.
-
Das Wort "any" kannste nicht einfach weglassen. Diese Wort verstärkt doch gerade, dass *jede* Schreiboperation synchronisiert werden muß.