Was ist der Unterschied zwischen einer ablaufinvarianten Funktion und einer thread-sicheren Funktion?
Antworten
Zu viele Anzeigen?
A threadsichere Funktion kann gleichzeitig von mehreren Threads aufgerufen werden, auch wenn die Aufrufe gemeinsame Daten verwenden, da alle Referenzen auf die gemeinsamen Daten serialisiert werden.
A ablaufinvariante Funktion kann auch gleichzeitig von mehreren Threads aus aufgerufen werden, allerdings nur, wenn jeder Aufruf seine eigenen Daten verwendet.
Daher ist eine thread-sichere Funktion immer ablaufinvariant, aber eine ablaufinvariante Funktion ist nicht immer thread-sicher.
Der Unterschied lässt sich anhand eines Beispiels nachvollziehen,
Eine Klasse gilt als ablaufinvariant, wenn ihre Mitgliedsfunktionen aufgerufen werden können sicher von mehreren Threads aufgerufen werden können, solange jeder Thread eine andere Instanz der Klasse verwendet. Die Klasse ist thread-sicher, wenn ihre Mitgliedsfunktionen Funktionen sicher von mehreren Threads aus aufgerufen werden können, selbst wenn alle Threads dieselbe Instanz der Klasse verwenden.
Quelle: Qt
Haben Sie die wiki-Artikel zu diesem Thema . Dort wird es gut erklärt, so dass Sie dort eine ausführliche Diskussion finden.
Ein paar relevante Auszüge aus dem Artikel:
In der Informatik wird ein Computerprogramm oder ein Unterprogramm als ablaufinvariant bezeichnet, wenn es mitten in der Ausführung unterbrochen werden kann und dann sicher wieder aufgerufen werden kann ("re-entered"), bevor die vorherigen Aufrufe die Ausführung abschließen. Die Unterbrechung kann durch eine interne Aktion, wie z. B. einen Sprung oder einen Aufruf, oder durch eine externe Aktion, wie z. B. eine Hardwareunterbrechung oder ein Signal, verursacht werden. Sobald der erneute Aufruf abgeschlossen ist, werden die vorherigen Aufrufe wieder korrekt ausgeführt.
und
Diese Definition der Wiederholungstendenz unterscheidet sich von der Definition der Thread-Sicherheit in Multi-Thread-Umgebungen. Ein ablaufinvariantes Unterprogramm kann Thread-Sicherheit erreichen, aber ablaufinvariant zu sein allein reicht möglicherweise nicht aus, um in allen Situationen Thread-Sicherheit zu gewährleisten. Umgekehrt muss thread-sicherer Code nicht unbedingt reentrant sein (Beispiele siehe unten).