Az Emerald programozási nyelv

Párhuzamosság

Az Emerald a párhuzamosságot, konkurenciát az aktív objektumokkal támogatja. Egy aktív objektum tartalmaz egy processzust, mely az objektum inicializálása után indul és az objektum operációinak hívásával párhuzamosan hajtódik végre. A következő példa az étkező filozófusok problémájában szereplő filozófus objektumot valósítja meg.
	const aPhilosopher <-
	  object P
	    process
	      loop
	        Table.pickupForks [p]
	        Node.sleep [eatingTime]
	        Table.putdownForks [p]
	        Node.sleep [thinkingTime]
	      end loop
	    end process
	  end P
Egy Emerald processzus egy független szálat reprezentál. Új szálakat dinamikusan lehet létrehozni egyszerűen új objektumok létrehozásával. A következő példában öt filozófus objektum jön létre.
	const anOrganizer <-
	  object Organizer
	    process
	      var count : Integer <- 5
	      const philoArray ¬ Array.of[Philosopher].create[5]
	      loop
	        philoArray[count] <-
	          object P
	          %lásd fent
	          end P
	        count <- count – 1
	        exit when count = 0
	      end loop
	    end process
	  end Organizer
Mivel az objektumok, melyek a philoArray elemeit alkotják nem exportálnak operációkat, objektum-konstruktort használunk, hogy a unixbeli fork utasításhoz hasonló hatást érjünk el.
Az Emeraldban az operációk hívása szinkronizált. Ez azt jelenti, hogy lehet több szimultán hívása ugyanannak az objektum operációnak. Sok nyelvben minden objektumnak van egy üzenetsora a bejövő kéréseknek és a szálak egy halmaza válaszol a kérésekre. Az Emerald monitort használ, hogy szabályozza a hozzáférést egy objektum állapotához, a szinkronizációt pedig a rendszer által definiált kondíció objektumok segítségével oldja meg. Az Emerald monitor hasonló a Konkurens Pascal és a Konkurens Euclid monitorához, de teljesen egy objektumba zártan valósul meg. Egy objektum processzusa a monitoron kívül kezdődik, de be tud lépni a monitorba a monitor operációinak meghívásával, ha megosztott állapotba szeretne kerülni.