Livelock?

1 Antwort

Vom Beitragsersteller als hilfreich ausgezeichnet

Gar nicht.

Ein Life-Lock wäre beispielsweise folgendes:

while(!tryConsumeBuf(&evProduced)){
    yield();
}
setEvent(&evConsumed);
______

while(!tryFillBuf(&evConsumed)){
    yield();
}
setEvent(&evProduced);

Relevant dafür ist, dass der Zustand der Threads nicht statisch ist sondern sich andauernd ändert. Kömmt nicht häufig vor, aber kann vorkommen. Ist halt im Endeffekt dann der Fall, wenn die Dead-Lock-Bedinung erfüllt ist, aber eben noch Code ausgeführt wird (in dem Falle das yield bzw. die Schleife selbst).

Ein komplizierteres Beispiel hätte ich beispielsweise bei einer Liste. Beim Einfügen wird versucht, das Ende zu finden und das neue Element dort einzufügen. Schlägt das fehl, dann wird erneut das Ende gesucht und das Element eingefügt.
Kommt es jetzt dazu, dass ein anderer Thread das letzte Element sperrt (dadurch ein einhängen verhindert) und dann in ein Deadlock kommt oder nicht mehr weiterläuft, dann wäre der Thread, der das Einfügen versucht, in einem Life-Lock (da er immer wieder versucht das Element anzufügen, das aber nicht funktioniert, da das letzte Element gesperrt ist).