AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein TInterlocked außerhalb eines TThreads?
Thema durchsuchen
Ansicht
Themen-Optionen

TInterlocked außerhalb eines TThreads?

Ein Thema von SneakyBagels · begonnen am 2. Jul 2017 · letzter Beitrag vom 3. Jul 2017
Antwort Antwort
Seite 1 von 2  1 2      
SneakyBagels
(Gast)

n/a Beiträge
 
#1

TInterlocked außerhalb eines TThreads?

  Alt 2. Jul 2017, 09:42
Ich säubere gerade meinen Code und ersetze an ein paar Stellen Inc() durch TInterlocked.Add().

Hat TInterlocked überall den Vorteil den der Befehl bringen sollte (Sicherheit beim Schreiben der Variable) oder muss das zwingend aus einem TThread aufgerufen werden?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.462 Beiträge
 
Delphi 12 Athens
 
#2

AW: TInterlocked außerhalb eines TThreads?

  Alt 2. Jul 2017, 10:08
Hat TInterlocked überall den Vorteil den der Befehl bringen sollte (Sicherheit beim Schreiben der Variable) oder muss das zwingend aus einem TThread aufgerufen werden?
Was verstehst du denn unter "Sicherheit beim Schreiben"? Solange die zu inkrementierende Variable nur aus einem Thread (z.B. dem Hauptthread) benutzt wird, besteht ja überhaupt keine Gefahr. Sobald aber auch andere Threads ins Spiel kommen muss das Interlocked immer verwendet werden (auch aus dem Hauptthread) - solange keine anderen Schutzmechanismen (z.B. CriticalSection) aktiv sind.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#3

AW: TInterlocked außerhalb eines TThreads?

  Alt 2. Jul 2017, 11:15
Zitat:
Was verstehst du denn unter "Sicherheit beim Schreiben"? Solange die zu inkrementierende Variable nur aus einem Thread (z.B. dem Hauptthread) benutzt wird, besteht ja überhaupt keine Gefahr
Hat es denn irgendwelche Nachteile, wenn man trotzdem überall TInterLocked statt Inc verwendet?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.462 Beiträge
 
Delphi 12 Athens
 
#4

AW: TInterlocked außerhalb eines TThreads?

  Alt 2. Jul 2017, 11:54
Hat es denn irgendwelche Nachteile, wenn man trotzdem überall TInterLocked statt Inc verwendet?
Durch den Oberhead beim Aufruf von TInterlocked ist das potentiell weniger performant:

Delphi-Quellcode:
Unit191.pas.39: TInterlocked.Increment(I);
005FA2E4 8D45F8 lea eax,[ebp-$08]
005FA2E7 BA01000000 mov edx,$00000001
005FA2EC E8B725F1FF call TInterlocked.Add
005FA2F1 8945F4 mov [ebp-$0c],eax

Unit191.pas.40: Inc(I);
005FA2F4 FF45F8 inc dword ptr [ebp-$08]
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#5

AW: TInterlocked außerhalb eines TThreads?

  Alt 2. Jul 2017, 12:05
Ich habe das gerade mal geprüft und eine etwas längere Prozedur gestartet die gewisse Dinge tut - und das 3550 Mal.
Wenn es einen Unterschied gibt, dann liegt der im Millisekundenbereich.
Mit Inc() war der Prozess in 45 Sekunden erledigt, mit TInterLocked.Add in 44.

Und selbst wenn es umgekehrt wäre, würde ich trotzdem TInterLocked aktuell bevorzugen. Ich hatte noch sehr viele Stellen mit Inc und das in einer multithreaded Anwendung.

Geändert von SneakyBagels ( 2. Jul 2017 um 12:07 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.613 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: TInterlocked außerhalb eines TThreads?

  Alt 2. Jul 2017, 12:56
Und selbst wenn es umgekehrt wäre, würde ich trotzdem TInterLocked aktuell bevorzugen. Ich hatte noch sehr viele Stellen mit Inc und das in einer multithreaded Anwendung.
Solange es sich um lokale Variablen handelt, ist Inc genauso "sicher" wie irgendein Interlocked-Befehl. Handelt es sich um globale oder sonstwie mehrfach benutzte Variablen (Felder), dann bedeutet die Verwendung von Interlocked-Befehlen nicht automatisch, dass die Verwendung threadsafe ist. Evtl. erzeugst Du damit lediglich ein falsches Gefühl der Sicherheit.
Thomas Mueller
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#7

AW: TInterlocked außerhalb eines TThreads?

  Alt 2. Jul 2017, 13:01
Zitat:
dann bedeutet die Verwendung von Interlocked-Befehlen nicht automatisch, dass die Verwendung threadsafe ist. Evtl. erzeugst Du damit lediglich ein falsches Gefühl der Sicherheit.
Wofür soll TInterLocked denn sonst da sein?

Das würde ja das hier revidieren:
Zitat:
Sobald aber auch andere Threads ins Spiel kommen muss das Interlocked immer verwendet werden (auch aus dem Hauptthread) - solange keine anderen Schutzmechanismen (z.B. CriticalSection) aktiv sind.

Geändert von SneakyBagels ( 2. Jul 2017 um 13:10 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.462 Beiträge
 
Delphi 12 Athens
 
#8

AW: TInterlocked außerhalb eines TThreads?

  Alt 2. Jul 2017, 14:30
Zitat:
dann bedeutet die Verwendung von Interlocked-Befehlen nicht automatisch, dass die Verwendung threadsafe ist. Evtl. erzeugst Du damit lediglich ein falsches Gefühl der Sicherheit.
Wofür soll TInterLocked denn sonst da sein?

Das würde ja das hier revidieren:
Zitat:
Sobald aber auch andere Threads ins Spiel kommen muss das Interlocked immer verwendet werden (auch aus dem Hauptthread) - solange keine anderen Schutzmechanismen (z.B. CriticalSection) aktiv sind.
Das ist halt eine notwendige Bedingung, aber keine hinreichende.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.592 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: TInterlocked außerhalb eines TThreads?

  Alt 2. Jul 2017, 14:46
Hat es denn irgendwelche Nachteile, wenn man trotzdem überall TInterLocked statt Inc verwendet?
Es ist abgesehen von der Performance auch der Codequalität nicht gerade zuträglich. Denn jeder Leser überlegt bei einem solchen Quelltext zuerst wie an solchen Stellen parallele Zugriffe erfolgen könnten.

Und umgekehrt denkt jemand vielleicht, dass der Code schon threadsicher ist, obwohl nur die eine Variable threadsicher verändert wird und der Rest nicht geschützt ist. Wenn ich so unseren Code durchschaue, sehe ich nicht viele Stellen, an denen solch ein Interlocked-Befehl ausreicht. Den verwenden wir zur Synchronisation mit anderen Threads, aber für sich genommen würde der nur an ein oder zwei Stellen etwas bringen.

Um eine saubere Trennung der Threads usw. kommst du mit so etwas nicht herum...
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#10

AW: TInterlocked außerhalb eines TThreads?

  Alt 2. Jul 2017, 14:52
Zitat:
Um eine saubere Trennung der Threads usw. kommst du mit so etwas nicht herum...
Keine Sorge. Ich verwende nicht nur TInterLocked.
  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 22:16 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