AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Threads: Wieso gibt's keine InterlockedRead - Funktion?
Thema durchsuchen
Ansicht
Themen-Optionen

Threads: Wieso gibt's keine InterlockedRead - Funktion?

Ein Thema von TStringlist · begonnen am 1. Jun 2004 · letzter Beitrag vom 6. Jun 2004
Antwort Antwort
Seite 1 von 2  1 2      
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#1

Threads: Wieso gibt's keine InterlockedRead - Funktion?

  Alt 1. Jun 2004, 12:35
Hallo,

bei einem kleinen Trip durchs Thema 'Threads' bin ich gerade bei den Interlocked-Funktionen angekommen ...und hätte da jetzt mal folgende kurze Frage: Warum gibt es hier eigentlich keine derartige Funktion mit der man eine von mehreren Threads gleichzeitig genutzte Variable einfach nur Auslesen kann, ...also ohne sie auch jedesmal immer mit verändern zu müssen.

Es fällt nämlich auf, dass diese Interlocked-Funktionen den Wert der jeweiligen Variablen immer auch mit verändern. ...Was vielleicht auch wiederum heißen könnte, dass für das nur Lesen einer solchen Variablen deswegen eigentlich auch gar keine Interlocked-Funktion notwendig ist? ...und zwar deswegen, weil ein Thread fürs Schreiben einer Variablen bis zum Schreibende dann jeweils ununterbrochen durcharbeiten darf und somit eh immer gefahrlos gelesen werden kann?


Weiß hier irgendjemand eventuell genaueres?

Thx im Voraus


PS. Denkbare Situationen in denen das nützlich wäre, gibt's ja auch genug, ...z.B. solche, in denen ein quasi 'WatchDog'-Thread die Arbeit anderer Threads überwacht, und zwar eben durch das nur Auslesen (ohne Änderung!) von z.B. kontinuierlich anwachsenden Variablewerte mit denen diese anderen Threads dann auch normal weiterzuarbeiten hätten...

PPS. Jetzt mal InterlockedCompareExchange ausgenommen, mit der man sich ja so eine Abfrage (ohne gleichzeitig Änderung der abzufragenden Variablen) auch zur Not noch selbst herbeikonstruieren könnte, die dafür aber bestimmt nicht gedacht ist, oder?
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#2

Re: Threads: Wieso gibt's keine InterlockedRead - Funktion?

  Alt 1. Jun 2004, 12:47
ganz einfach: beim auslesen entstehen keinerlei komplikationen, d.h. zum auslesen muss der speicher nicht zwischengesperrt werden, da beliebeig viele threads gleichzeitig lesen können dürfen.
  Mit Zitat antworten Zitat
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Threads: Wieso gibt's keine InterlockedRead - Funktion?

  Alt 1. Jun 2004, 13:52
@Melfin

ich fragte nur, weil für ein nur Lesen im SpinLock-Tutorial extra nochmal die InterlockedExchanged-Funktion benutzt wurde, ...mir selbst diesbezüglich allerdings auch nicht absolut sicher war, ob es aber andrerseits dann ganz ohne Interlocked auch tatsächlich geht (...was sich einem dann aber aus den besagten Gründen wieder irgendwie aufdrängt).

Du glaubst also auch, dass ein nur Auslesen keine solche Funktionen benötigt. Hmmm, dachte ich mir's also *g*. Thx.
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#4

Re: Threads: Wieso gibt's keine InterlockedRead - Funktion?

  Alt 1. Jun 2004, 13:54
ich glaube es nicht nur, ich weis es sogar wie schon gesagt muss man einen lesevorgang ja nicht absichern!
  Mit Zitat antworten Zitat
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Threads: Wieso gibt's keine InterlockedRead - Funktion?

  Alt 1. Jun 2004, 14:22
ah, supi.

Thx^2
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
woki

Registriert seit: 29. Mär 2003
563 Beiträge
 
Delphi 2006 Architect
 
#6

Re: Threads: Wieso gibt's keine InterlockedRead - Funktion?

  Alt 1. Jun 2004, 14:28
Dann vielleicht doch:

Auch Lesevorgänge muß man absichern, wenn diese nicht atomar sind, d.h. während ein Thread am Lesen ist, kann ja ein anderer, der schreiben will, die Kontrolle bekommen, und dann bekommt der lesende bei einem nichtatomaren Lesevorgang eventuell nicht konsistente Daten.

Grüsse
Woki
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#7

Re: Threads: Wieso gibt's keine InterlockedRead - Funktion?

  Alt 1. Jun 2004, 15:15
nein, weil der, der schreiben will, normalerweise keinen zugriff bekommt, weil ja ein thread am lesen ist
  Mit Zitat antworten Zitat
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Threads: Wieso gibt's keine InterlockedRead - Funktion?

  Alt 1. Jun 2004, 17:22
@Meflin

woher weiß aber der Thread (der der jetzt schreiben möchte), dass ein anderer gerade liest, wenn dieser andere das wiederum nicht durch das Benutzen irgendeiner dieser speziellen Funktionen (oder sonst irgendwie) bekannt gemacht hat?

@woki

...und wann ist ein Lesevorgang atomar?

In meinem Fall ging ich bei der so 'WatchDog-Thread'-mäßig jeweils zu prüfende Variablen von einer einfache Integergröße aus. Wäre das noch ein atomarer Lesevorgang? Wann ist ein solcher Lesevorgang atomar? Wenn er sich in nur einen einzigen (in solchen Fällen immer benutzten) Assembler-Befehl übersetzen lässt?

Beim Lesen komplexer (also nicht-atomarer?) Daten, wie z.B. Records o.ä., ist das schon eher nachvollziehbar. Aber die könnte man ja mit so einer Interlocked-Funktion auch ebenfalls nicht schreiben. Dafür bräuchte man, ob fürs Lesen oder Schreiben, sowieso eher eine Critical Section?

@Alle

Könnte man sagen: Für alle Variablen, die ich über die Interlocked-Funktionen verändern kann (wenn ich das wollen würde), brauche ich, wenn ich die jetzt aber einfach nur auslesen möchte, keine Absicherung? ...weil ein Lesen in diesen Fällen event. immer atomar wäre?
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
Ratte

Registriert seit: 12. Dez 2003
Ort: Erfurt
345 Beiträge
 
Delphi 2005 Personal
 
#9

Re: Threads: Wieso gibt's keine InterlockedRead - Funktion?

  Alt 1. Jun 2004, 19:53
Hi,

bei mir hagelt's Fehler wenn zwei gliechzeitig auf eine Variable zugreifen.

Ratte
Schiffsratte der U.S.S. Delphipraxis, Laderaum 4538
BUSH:= TTerminator.create;
  Mit Zitat antworten Zitat
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Threads: Wieso gibt's keine InterlockedRead - Funktion?

  Alt 1. Jun 2004, 21:29
aber nicht, wenn beide Threads nur lesend zugreifen, oder? Dann dürfte ja ohnehin kein Fehler eintreten, egal ob ein solcher Lesevorgang jetzt in einem einzigen (atomaren) Arbeitsakt ausgeführt würde oder dieser durch einen event. zweiten Lesevorgang eines anderen Threads unterbrochen werden kann ...weil ja die Variable auch durch diesen zweiten Lesevorgang unverändert bliebe und damit auch das erste Auslesen danach noch ohne Schwierigkeiten bzw. ohne Fehler beendet werden könnte.

Ein Problem bei einem Lesevorgang durch einen Thread1 habe ich doch nur dann, wenn ein solcher quasi irgendwo in der Mitte durch einen anderen Thread2, der nun gerade auf die gleiche Variable schreiben will, unterbrochen werden kann und der damit einen Teil der von Thread1 danach noch fertig zu lesenden Variablen ändert ...was ja bei Thread1 dann schließlich meistens einen falschen End-Wert ergeben dürfte.

Und daher auch nochmal die Frage: Sind Nur-Lesevorgänge bezüglich der Variablen, die sonst über diese Interlocked-Funktionen auch immer mit verändert werden, ...sind die überhaupt unterbrechbar, also nicht atomar? Und wenn ja, warum gibt es dann eigentlich keine InterlockedRead-Funktion. Das wäre doch dann quasi nur das aller logischste überhaupt, oder?
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:26 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz