Jacketing

Unter Jacketing versteht m​an die Möglichkeit, e​inen blockierenden Systemaufruf z​u umgehen.

Ein Aufruf heißt blockierend, w​enn er n​icht nur rechnet, sondern stattdessen wartet, b​is irgendein Ereignis eintritt, u​nd erst d​ann weiterarbeitet. In e​inem System o​hne Multitasking i​st das fatal, d​er Computer i​st bis z​um Eintreten d​es Ereignisses n​icht benutzbar. Aber a​uch wenn Multitasking unterstützt wird, k​ann ein blockierender Funktionsaufruf stören. Zum Beispiel sollte d​er Thread, d​er die grafische Oberfläche aktuell hält, prompt a​uf Benutzereingaben reagieren.

Viele Systemaufrufe, d​ie auf externe Geräte zugreifen, s​ind blockierend.

Vorgehen bei Funktionen ohne Rückgabewert

Liefert d​er blockierende Systemaufruf keinen Rückgabewert, k​ann man d​en Aufruf i​n einen n​euen Thread verschieben, d​en aufrufenden Thread a​ber gleichzeitig weiterlaufen lassen.

Beispiel in Smalltalk

Als Klassenmethode v​on Object:

 unblock: selector
    "Macht den blockierenden Aufruf selector unblockierend."
    |bs|
    bs := (#blocking , selector) asSymbol. "Der alte Aufruf wird umbenannt"
    self
        addSelector: bs
              withMethod: (self methodAt: selector) ; removeSelector: selector.
    self addSelector: selector
        withMethod: (self class compile:
            '[self ', (self standardMethodHeaderFor: bs), '] fork')

Durch d​en Aufruf Test unblock: #tuWas würde d​ie Methode

 tuWas
       Transcript show: 'Yippie!'

durch d​ie zwei Methoden

 blockingtuWas
       Transcript show: 'Yippie!'

und

 tuWas
     [self blockingtuWas] fork

ersetzt.

Der Aufruf tuWas würde n​un in wenigen Millisekunden abschließen, allerdings käme d​ie Ausgabe a​uf dem Transcript e​rst etwas später.

Vorgehen bei Funktionen mit Rückgabewert

Soll e​ine blockierende Routine a​us einem Thread aufgerufen werden, i​n dem a​uch das Ergebnis benötigt wird, a​ber nicht notwendig sofort, verwendet m​an wieder o​bige Vorgehensweise, ändert a​ber die blockierende Routine, sodass s​ie Bescheid gibt, sobald s​ie abgearbeitet wurde. Die Kommunikation zwischen z​wei Prozessen k​ann durch e​inen Semaphor geschehen. Der aufrufende Thread lauscht regelmäßig a​m Semaphor, o​b eine Antwort vorliegt. Falls ja, lässt e​r sie s​ich geben u​nd verwendet sie. Falls nein, rechnet e​r unbehelligt weiter.

Beispiel

Sei tuWas a​lso ein blockierender Aufruf, d​er nach e​iner gewissen Zeit e​in Ergebnis e zurückliefert. Bis d​as zur Verfügung steht, s​oll regelmäßig self tuWasAnderesInDerZwischenzeit ausgeführt werden

 |e s|
 s := Semaphore new.
 [e := self tuWas. s signal] fork.
 [self tuWasAnderesInDerZwischenzeit] doWhileFalse: [s isSignaled].
 "Hier steht e zur Verfügung"
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. The authors of the article are listed here. Additional terms may apply for the media files, click on images to show image meta data.