Thread (Informatik)

Thread (Informatik)

Ein Thread (auch: Aktivitätsträger oder leichtgewichtiger Prozess) bezeichnet in der Informatik einen Ausführungsstrang oder eine Ausführungsreihenfolge in der Abarbeitung eines Programms. Ein Thread ist Teil eines Prozesses.

Man unterscheidet zwei Arten von Threads. Threads im engeren Sinne (Kernelthread) laufen als Teil des Betriebssystems ab, im Gegensatz zu User Threads. Im Folgenden wird unter Thread ein Kernelthread im engeren Sinne verstanden.

Inhaltsverzeichnis

Threads aus Sicht des Betriebssystems

Mehrere Kernelthreads in einem Prozess (Task).
Fehler in der Darstellung: Neben dem IP müssen auch alle anderen CPU-Register gerettet werden

Ein (Kernel-)Thread ist ein sequentieller Abarbeitungslauf eines Prozesses und teilt sich mit den anderen vorhandenen Threads (multithreading) des zugehörigen Prozesses eine Reihe von Betriebsmitteln, nämlich das Codesegment, das Datensegment und die verwendeten Dateideskriptoren.

Threads innerhalb des gleichen Prozesses sind verschiedenen Prozessoren zugeordnet oder verwenden voneinander unabhängige Registersätze sowie unabhängige Stapel (Stacks), die unterschiedlichen Abschnitten des Adressraums zugeordnet sind. Andere Betriebsmittel werden von allen Threads gemeinsam verwendet. Als Besonderheit kann es Betriebsmittel geben, die nur von dem erzeugenden Thread benutzt werden können oder dürfen (Beispiel: Thread-local Storage, Window-Handle). Durch die gemeinsame Nutzung von Betriebsmitteln kann es auch zu Konflikten kommen. Diese müssen durch den Einsatz von Synchronisationsmechanismen aufgelöst werden.

Da Threads, die demselben Prozess zugeordnet sind, den gleichen Adressraum verwenden, ist eine Kommunikation zwischen diesen Threads von vornherein möglich (vgl. mit Interprozesskommunikation bei Prozessen).

Jeder „Programmfaden“ ist für die Ausführung einer bestimmten Aufgabe verantwortlich. Die Ausführungsstränge der Programmfunktionen können damit in überschaubare Einheiten aufgeteilt werden.

Bei den meisten Betriebssystemen kann ein Thread neben dem Zustand inaktiv die Zustände rechnend (engl. running), rechenbereit (engl. ready) und blockiert (engl. waiting) annehmen. Im Zustand rechnend findet die Ausführung von Befehlen auf der CPU statt, bei rechenbereit ist der Thread gestoppt, um einen anderen Thread rechnen zu lassen und bei blockiert wartet der Thread auf ein Ereignis.

Bedeutungsunterschied (Kernel-) Thread gegenüber Prozess, Task und User Thread

Ein Prozess bezeichnet den Ablauf eines Computerprogrammes auf einem oder mehreren Prozessor(en). Einem Prozess sind ein Speicherraum und weitere Betriebssystemmittel zugeordnet. Ein Prozess kann aus einem oder mehreren Threads bestehen. Threads teilen sich innerhalb eines Prozesses Prozessoren, den Speicher und andere, betriebssystemabhängige Ressourcen wie Dateien und Netzwerkverbindungen. Deswegen ist der Verwaltungsaufwand für Threads üblicherweise geringer als der für Prozesse. Ein wesentlicher Effizienzvorteil von Threads besteht darin, dass im Gegensatz zu Prozessen beim Threadwechsel kein vollständiger Wechsel des Prozesskontextes notwendig ist, da alle Threads einen gemeinsamen Teil des Prozesskontextes verwenden. Ein Prozess kann aus genau einem Thread des Betriebssystems bestehen, wenn bei dem Programmablauf keine Parallelverarbeitung vorgesehen ist.

Bereits in den 1980er Jahren gab es sogenannte Multitask-Betriebssysteme, da im Unterschied zu den joborientierten Systemen insbesondere in der damals so bezeichneten Prozessrechentechnik mehrere Aufgaben quasi parallel ausgeführt werden mussten. Damals hat sich der Begriff Task für eine Aufgabe aus Sicht des Betriebssystems eingebürgert, das ist synonym zu dem hier beschriebenen Thread. Der Begriff Task (deutsch: Aufgabe) wird in der Softwarearchitektur aber auch unscharf allgemein für zusammenhängende Aufgaben benutzt, insbesondere auch synonym für Prozess eingesetzt.

Ein Thread ist wörtlich ein einzelner Ausführungsfaden eines Programms, der Begriff Thread wird aber auf den Ausführungsstrang aus Sicht des Betriebssystems eingesetzt (Kernelthread). In einer Anwendersoftware kann dieser Ausführungsstrang durch geeignete Programmierung nochmals in unabhängige Einzelstränge unterteilt werden. Im englischen Sprachraum hat sich für den einzelnen Ausführungsstrang der Anwendersoftware der Begriff User Thread (bei Microsoft Fiber, deutsch: Faser) eingebürgert. Bei User Threads ist allein die Anwendersoftware für die Verwaltung ihrer Ausführungsstränge zuständig.

Beispiele

Die folgende Tabelle zeigt Beispiele für die verschiedenen Kombinationen aus Prozess, Kernel- und User-Thread:

Prozess Kernel-
Thread
User-
Thread
Beispiel
Nein Nein Nein Ein Computerprogramm unter MS-DOS ablaufend. Das Programm kann zu einer Zeit nur eine Aktion ausführen.
Nein Nein Ja Windows 3.1 auf der Oberfläche von DOS. Alle Windows-Programme laufen in einem einfachen Prozess, ein Programm kann den Speicher eines anderen Programms zerstören, was den bekannten General Protection Fault (Allgemeine Schutzverletzung) zur Folge hat.
Nein Ja Nein Ursprüngliche Implementierung des Amiga OS. Das Betriebssystem unterstützt vollständig Threads und erlaubt dabei, dass mehrere Applikationen unabhängig voneinander ablaufen, vom Betriebssystemkern zeitlich geplant. Wegen der nicht vorhandenen Prozessunterstützung ist das System effizienter (wegen der Vermeidung des Zusatzaufwandes des Speicherschutzes), mit dem Preis, dass Applikationsfehler den gesamten Computer lahmlegen können.
Nein Ja Ja DR-DOS 7.01, 7.03, 8.0; Enhanced DR-DOS alle Versionen
Mac OS 9 unterstützt User-Threads mittels Apples Thread Manager und Kernelthreads mittels Apples Multiprocessing Services, das mit dem nanokernel arbeitet, eingeführt in Mac OS 8.6. Damit werden Threads unterstützt, aber immer noch das Verfahren des MultiFinder zum Verwalten von Applikationen benutzt.
Ja Nein Nein Die meisten bekannten Implementierungen von Unix (außer Linux). Das Betriebssystem kann mehr als ein Programm zu einem Zeitpunkt ausführen, die Programmabarbeitungen sind gegeneinander geschützt. Wenn ein Programm sich falsch verhält, kann es seinen eigenen Prozess stören, was das Beenden dieses einen Prozesses zur Folge haben kann, ohne dass das Betriebssystem oder andere Prozesse gestört werden. Jedoch kann der Informationsaustausch zwischen Prozessen entweder fehlerträchtig sein (bei Nutzungen von Techniken wie shared memory) oder aufwendig (bei Nutzung von Techniken wie message passing). Die asynchrone Ausführung von Aufgaben benötigt einen aufwendigen fork() Systemaufruf.
Ja Nein Ja Sun OS (Solaris) von Sun. Sun OS ist Sun Microsystems Version von Unix. Sun OS implementiert User-Threads als sogenannte green threads um einem einfachen Prozess die asynchrone Ausführung mehrerer Aufgaben zu ermöglichen, beispielsweise playing a sound, repainting a window, oder auf ein Bedienerereignis zu reagieren wie die Anwahl des stop button. Obwohl Prozesse präemptiv verwaltet werden, arbeiten die green threads kooperativ. Dieses Modell wird oft an Stelle von richtigen Threads genutzt und ist in Mikrocontrollern und sogenannten embedded devices immer noch aktuell, und wird sehr häufig genutzt.
Ja Ja Nein Dies ist der allgemeine Fall der Applikationen unter Windows NT ab 3.51 SP3+, Windows 2000, Windows XP, Mac OS X, Linux, und anderen modernen Betriebssystemen. Alle diese Betriebssysteme erlauben dem Programmierer die Nutzung von User-Threads beziehungsweise von Bibliotheken, die selbst User-Threads verwenden, jedoch nutzen nicht alle Programme diese Möglichkeit aus. Weiterhin können User-Threads auch vom Betriebssystem automatisch für jede gestartete Applikation angelegt werden (zum Beispiel zur Bedienung der grafischen Benutzeroberfläche), ohne dass dies explizit vom Programmierer getan werden muss; solche Programme sind dann automatisch multithreaded. Außerdem ist es notwendig, mehrere User-Threads zu verwenden, wenn man mehrere Prozessoren/Prozessorkerne in der Anwendung ausnutzen möchte.
Ja Ja Ja Die meisten Betriebssysteme seit 1995 fallen in diese Kategorie. Die Nutzung von Threads zur gleichzeitigen Ausführung ist die gewöhnliche Auswahl, obwohl es auch multi-process- und multi-fiber-Applikationen gibt. Diese werden beispielsweise benutzt, damit ein Programm seine grafische Benutzerschnittstelle abarbeiten kann, während es gleichzeitig auf eine Eingabe des Benutzers wartet oder andere Arbeiten im Hintergrund ausführt.

Bemerkungen:

  • Die Nutzung von User-Threads ist prinzipiell unabhängig vom Betriebssystem. Sie ist damit mit jedem Betriebssystem möglich. Wichtig ist nur, dass sich der komplette Zustand des Prozessors auslesen und wieder zurückschreiben läßt (User-Threads sind auch in einigen 8-Bit-Betriebssystemen implementiert worden, so z.B. als GEOS auf dem C64/C128). Daher sind die Werte in der Tabelle als Anhaltswerte zu sehen.
  • Einige moderne Betriebssysteme (z. B. Linux) lassen keine strikte Unterscheidung zwischen Prozessen und Kernel-Threads mehr zu. Beides geschieht mit dem selben Systemruf (clone(2)), man kann feingranular angeben, welche Ressourcen geteilt und welche nicht geteilt werden (Ausnahme: CPU-Register, Stack). Bei etlichen Ressourcen kann man das zur Laufzeit des Threads sogar noch ändern (Speicher: TLS vs. Shared Memory, File Handle: socketpair).

Implementierungen

Java

In Java ist ein Arbeiten mit mehreren Threads von vornherein vorgesehen. Dabei funktioniert das Multithreading auch, wenn das Betriebssystem dieses nicht oder nur mangelhaft unterstützt. Möglich ist das, weil die virtuelle Maschine von Java die Threadumschaltung einschließlich Stackverwaltung übernehmen kann. In Betriebssystemen mit Threadunterstützung können die Betriebssystemeigenschaften direkt genutzt werden. Die Entscheidung darüber liegt in der Programmierung der virtuellen Maschine.

In Java gibt es im Basis-Package java.lang die Klasse Thread. Instanzen dieser Klasse sind Verwaltungseinheiten der Threads. Thread kann entweder als Basisklasse für eine Anwenderklasse benutzt werden, oder eine Instanz von Thread kennt eine Instanz einer beliebigen Anwenderklasse. Im zweiten Fall muss die Anwenderklasse die Schnittstelle java.lang.Runnable implementieren und demzufolge eine Methode run() enthalten.

Ein Thread wird gestartet mittels Aufruf von thread.start(). Dabei wird die zugeordnete run()-Methode abgearbeitet. Solange run() läuft, ist der Thread aktiv.

In der Methode run() oder in den von dort gerufenen Methoden kann der Anwender mittels wait() den Thread eine Zeit (in Millisekunden angegeben) oder auch beliebig lange warten lassen. Dieses Warten wird aber mit einem notify() aus einem anderen Thread beendet. Das ist ein wichtiger Mechanismus der Inter-Thread-Kommunikation. wait() und notify() sind Methoden der Klasse Object und auf alle Instanzen von Daten anwendbar. Zueinandergehörige wait() und notify() sind an derselben Instanz (einer Anwenderklasse) zu organisieren, sinnvollerweise werden in dieser Instanz dann auch die Daten übergeben, die ein Thread dem anderen mitteilen möchte.

Die Realisierung von kritischen Abschnitten erfolgt mit synchronized.

In der ersten Version von Java wurden Methoden der class Thread zur Unterbrechung eines Threads von außen, Fortsetzung und Abbruch eingeführt: suspend(), resume() und stop(). Diese Methoden wurden aber recht schnell in Nachfolgeversionen als Deprecated (ausgedient, missbilligt) bezeichnet. In der ausführlichen Begründung wurde ausgeführt, dass ein System unsicher ist, wenn ein Thread von außen angehalten oder abgebrochen werden kann. Die Begründung mit wenigen Worten ist folgende: Ein Thread kann sich möglicherweise in einer Phase eines kritischen Abschnittes befinden und Daten teilweise geändert haben. Wird er angehalten, dann ist der kritische Abschnitt blockiert, und deadlocks sind die Folge. Wird er abgebrochen und die Blockierung vom System aufgehoben, dann sind Daten inkonsistent. An dieser Stelle kann ein Laufzeitsystem nicht selbst entscheiden, ein Anhalten oder Abbruch eines Threads kann nur das Anwenderprogramm selbst steuern.

.NET

.NET unterstützt von Haus aus Threadprogrammierung. Realisiert wird dies durch die Klassen im Namensraum System.Threading.

Zusätzlich zu den oben genannten Konstrukten Prozess und Thread gibt es dort noch das Konzept einer Anwendungsdomäne (AppDomain). Ein Prozess kann dabei mehrere Anwendungsdomänen enthalten, diese werden von der Runtime isoliert ('logischer Prozess'), eine vom .NET Framework bereitgestellte Ressource ist an die erzeugende Anwendungsdomäne gebunden. Betriebsmittel des unterliegenden Betriebssystems (auch Kernelthreads!) sind aber nicht an diese logischen Prozessgrenzen gebunden.

Auch bietet die .NET-Runtime einen von der Runtime verwalteten Threadpool, der durch diese zur Verarbeitung von asynchronen Ereignissen und Ein-/Ausgabeoperationen verwendet wird.

Die .NET-Runtime unterscheidet außerdem zwischen Vordergrundthreads und Hintergrundthreads. Ein Thread wird zum Hintergrundthread durch setzen der Eigenschaft Background auf true. Ein Prozess wird beendet, wenn der letzte Vordergrundthread beendet ist. Alle dann noch laufenden Hintergrundthreads werden automatisch beendet. Threadpool Threads werden als Hintergrundthread gestartet.

Einen eigenständigen Thread startet man über eine neue Instanz einer Thread-Klasse, der im Konstruktor eine Rückruffunktion(Delegate) übergeben wird. Der Thread wird dann über die Instanzmethode Start() gestartet. Der Thread wird beendet, wenn die Rückruffunktion die Kontrolle an den Aufrufer zurückgibt.

Alternativ ist für kurze Hintergrundverarbeitung der ThreadPool der .NET Runtime nutzbar. Dieser hält eine gewisse Anzahl von Threads vor, die über ThreadPool.QueueUserWorkItem() zur Verarbeitung genutzt werden können. Nach Rückkehr der übergebenen Rückruffunktion wird der Thread dann nicht durch das Betriebssystem zerstört sondern für die spätere Verwendung zwischengespeichert. Vorteil dieser Klasse ist die optimierte, beschränkte Nutzung des zugrunde liegenden Betriebsmittels.

Eine externe Steuerung der Threads ist möglich (Abort(), Suspend(), Resume()), kann aber zu unvorhersehbaren Ereignissen wie deadlocks oder Abbrüchen der Anwendungsdomäne führen. Deshalb sind Suspend und Resume in neueren Versionen von .NET als obsolet markiert.

Die Synchronisation von Threads erfolgt durch ein WaitHandle. Genutzt wird dieser meistens über die Klasse Monitor die einen durch jedes .NET-Objekt zur Verfügung gestellten Mutex nutzt. In C# kann dazu das lock(object){ Anweisung; } Konstrukt genutzt werden. Viele Klassen des .NET-Framework existieren zusätzlich in einer Threadsicheren Variante die über eine statische Methode Synchronized() erstellt werden kann.

Unix/Linux

Unter Unix gibt es von je her einfach zu beherrschende Systemaufrufe zur Erzeugung paralleler Prozesse (fork). Mit diesem Mittel wird unter Unix/Linux traditionell die Parallelverarbeitung realisiert. Threads sind in späteren Unix-Versionen eingefügt worden, jedoch war die Portabilität zwischen früheren Derivaten nicht gewährleistet. Der Standard POSIX-Thread (Native POSIX Thread Library) legte schließlich einen einheitlichen Mindestfunktionsumfang und einheitliche API fest, die auch von aktuellen Linux-Versionen unterstützt wird (NPTL). Gegenüber einem Prozess wird ein Thread auch als Leichtgewichtprozess (Solaris) bezeichnet, da die Umschaltung zwischen Prozessen mehr Aufwand (Rechenzeit) im Betriebssystem erfordert als die Umschaltung zwischen Threads eines Prozesses.

Windows

Um unter Windows in C oder C++ einen eigenen Thread zu erzeugen, kann man direkt auf die Windows-API-Schnittstellen zugreifen. Dazu muss man als einfaches Muster aufrufen:

   #include <windows.h>
   DWORD threadId;
   HANDLE hThread = CreateThread (NULL, 0, runInThread, p, 0, &threadId);
   CloseHandle (hThread);

runInThread ist die Subroutine, die in diesem Thread laufen soll, sie wird unmittelbar danach aufgerufen. Wird runInThread beendet, dann ist auch der Thread beendet, ähnlich wie Thread.run() in Java.

Diese API-Schnittstelle ist eine C-orientierte Schnittstelle. Um Threads auch objektorientiert zu programmieren, kann nach folgendem Schema in der Subroutine runInThread eine Methode einer Klasse gerufen werden:

   DWORD WINAPI runInThread(LPVOID runnableInstance)
   {
      Runnable* runnable = static_cast <Runnable*> (runnableInstance);
                           // Klassenzeiger oder Zeiger auf Basisklasse
      return(runnable->run());  // run-Methode dieser Klasse wird gerufen.
   }

Diejenige Klasse, die die run()-Methode für den Thread enthält, ist hier in einer Klasse Runnable enthalten, das kann auch eine Basisklasse einer größeren Klasse sein. Der Zeiger auf die Instanz einer gegebenenfalls von Runnable abgeleiteten Klasse muss bei CreateThread als Parameter (p) übergeben werden, und zwar als (Runnable*) gecastet. Damit hat man hier die gleiche Technik wie bei Java in der Hand. Wie folgt wird die universelle Basisklasse (eine Schnittstelle) für alle Klassen, deren run()-Methoden in einem eigenem Thread laufen sollen, definiert:

   class Runnable   // abstrakte Basisklasse (als Schnittstelle verwendbar)
      {
         virtual DWORD fachMethode()=0; // API zum Vererben
      public:
         DWORD run() { return(fachMethode()); } // API zum Aufrufen
         virtual ~Runnable() {} // Wenn vererbt werden soll: Dtor virtuell
      };

Folgend wird die Anwenderklasse, mit der fachMethode[1] definiert:

   class MyThreadClass : public Runnable
      {
         DWORD fachMethode(); // Überschreibt/implementiert die Fachmethode
      };

Folgend wird die Anwenderklasse instanziiert und der Thread gestartet:

   MyThreadClass myThreadObject;
   hThread = CreateThread (NULL, 0, runInThread, &myThreadObject, 0, &threadId);

Wegen des dynamischen Bindens wird die gewünschte Methode myThread->fachMethode() gerufen. Achtung: Es muss auf den Lebenszyklus von myThreadObject geachtet werden: Man darf es nicht implizit „abräumen“, solange der neue Thread noch damit arbeitet! Hier ist Threadsynchronisation gefragt.

Weitere Zugriffe auf den Thread auf API-Ebene können unter Kenntnis des zurückgelieferten HANDLE ausgeführt werden, beispielsweise

   SetThreadPriority (hThread, THREAD_PRIORITY_BELOW_NORMAL);

oder um den Rückgabewert der aufgerufenen Methode runInThread abzufragen (im Beispiel 0):

   DWORD dwExitCode;
   GetExitCodeThread (hThread, &dwExitCode);

Schwierigkeiten

Die Verwendung von Threads, sowie einfacher Synchronisationsmechanismen wie Mutexen und Semaphoren, erweist sich in der Praxis als anspruchsvoll. Da der Programmablauf nicht mehr einfach sequentiell ist, kann ein Entwickler diesen nur schwer vorhersagen. Da die Ausführungsreihenfolge und der Wechsel zwischen den Threads vom Scheduler geregelt wird und der Entwickler nur wenig Einfluss darauf hat, gerät ein nebenläufiges Programm leicht in einen vorher nicht vorgesehenen Gesamtzustand, welcher sich durch Deadlocks, Livelocks, data corruption und Abstürzen äußert. Diese Effekte treten stochastisch auf und sind somit kaum reproduzierbar, was die Fehlersuche in einer Anwendung schwierig macht.

Threaddarstellung in UML

Parallele Prozesse werden in der Unified Modeling Language (UML) oft mit Zustandsdiagrammen (Statecharts) dargestellt. In einem Zustandsdiagramm sind innerhalb eines Zustandes interne parallele Teil-Zustandsdiagramme darstellbar. Alle Zustandsdiagramme des Gesamtsystems werden quasiparallel abgearbeitet. Die Quasiparallelität wird dadurch erreicht, dass jeder Zustandsübergang sehr kurz ist (in der Praxis wenige Mikrosekunden bis Millisekunden) und daher das Nacheinander der Abarbeitung als parallel erscheint. Der Übergang von einem Zustand in einen anderen wird typischerweise mit einem Ereignis (Event) ausgelöst, das zuvor in die sogenannte Eventqueue eingeschrieben wurde. Dieser Übergang aufgrund eines Ereignisses ist nach der oben angegebenen Definition ein Userthread. Prinzipiell ist die damit realisierte Parallelität mit nur einem einzigen Betriebssystem-Thread erreichbar.

Setzt man UML für schnelle Systeme ein, dann spielt die Frage einer zeitlichen Priorisierung eine Rolle. Können Zustandsübergänge längere Zeit in Anspruch nehmen oder es soll in einem Übergang noch zusätzlich auf Bedingungen gewartet werden (passiert bereits bei einem einfachen Lesen oder Schreiben auf eine Datei), dann muss eine Parallelität mit Threads realisiert werden. Aus diesem Grunde muss man die Zustandsdiagramm-Abarbeitung mehreren gegebenenfalls unterschiedlich prioren Threads des System zuordnen können. Das UML-Werkzeug Rhapsody kennt dazu den Begriff der aktiven Klasse. Jede aktive Klasse ist einem eigenen Thread zugeordnet.

Zusätzlich zur Formulierung von Parallelarbeit mit Zustandsdiagrammen kann auch in UML-entworfenen Systemen eine Parallelität mit Threads modelliert werden. Es kann dazu das Programmier-Modell verwendet werden, das Java bietet. In diesem Fall ist im Anwender-Modell eine explizite Klasse Thread mit den in Java bekannten Eigenschaften einzubringen. Damit sind hochzyklische Probleme einfacher und effektiver zu beherrschen, wie das folgende Beispiel zeigt:

void run()
{
   while (not_abort)             //zyklisch bis zum Abbruch von außen
   {
      data.wait();               //der Zyklus beginnt wenn Daten vorliegen
      dosomething();             //Abarbeitung mehrerer Dinge
      if (condition)
      {
         doTheRightThing();    //Abarbeitung ist von Bedingungen abhängig
         partnerdata.notify(); //andere Threads benachrichtigen
      }
   }
}

Die hier gezeigte Methode run() ist eine Methode einer Anwenderklasse, in ihr ist die gesamte Abarbeitung im Thread wie bei funktionalen Abarbeitungen auch in der UML üblich in Programmzeilen beschrieben. Die UML wird benutzt, um diese Anwenderklasse, die zugehörige Klasse Thread und deren Beziehungen zu zeigen (Klassendiagramm), ergänzt beispielsweise mit Sequenzdiagrammen. Die Programmierung ist übersichtlich. Ein Zustandsdiagramm bietet für diesen Fall keine besseren grafischen Möglichkeiten.

Siehe auch

Literatur

Weblinks

Einzelnachweise

  1. vgl. gotw.ca

Wikimedia Foundation.

Игры ⚽ Нужна курсовая?

Schlagen Sie auch in anderen Wörterbüchern nach:

  • Thread-Sicherheit — Threadsicherheit (engl. thread safety) ist eine Eigenschaft von Softwarekomponenten und hat eine wichtige Bedeutung in der Softwareentwicklung. Sie besagt, dass eine Komponente gleichzeitig von verschiedenen Programmbereichen mehrfach ausgeführt… …   Deutsch Wikipedia

  • Thread-safe — Threadsicherheit (engl. thread safety) ist eine Eigenschaft von Softwarekomponenten und hat eine wichtige Bedeutung in der Softwareentwicklung. Sie besagt, dass eine Komponente gleichzeitig von verschiedenen Programmbereichen mehrfach ausgeführt… …   Deutsch Wikipedia

  • Thread — Das Wort Thread (vom englischen thread für „Gewinde“ oder „Faden“) steht für: die englische Bezeichnung für das Einfädeln oder für dünnes Nähgarn ein Ausführungsstrang oder eine Ausführungsreihenfolge der Abarbeitung der Software auf einem… …   Deutsch Wikipedia

  • User-Level Thread — Als User Thread, User level Thread oder Fiber (Windows) bezeichnet man in der Informatik eine bestimmte Art, Programme bzw. Programmteile verzahnt ablaufen zu lassen. Die Funktionalität ist dabei nicht direkt im Betriebssystemkern implementiert… …   Deutsch Wikipedia

  • Teile und Herrsche (Informatik) — Der Grundsatz Teile und herrsche (engl. divide and conquer bzw. lat. divide et impera) findet in vielen Teilgebieten der Informatik Anwendung und beschreibt einen reduktionistischen Lösungsansatz. Programmiersprachen In vielen Programmiersprachen …   Deutsch Wikipedia

  • Funktor (Informatik) — Die C++ Standardbibliothek ist eine standardisierte Programmierbibliothek zur allgemeinen Verwendung. Sie stellt verschiedene generische Container, Funktionen zu deren Manipulierung, Funktionsobjekte, generische Zeichenketten (auch „Strings“… …   Deutsch Wikipedia

  • Faden (Informatik) — Ein Thread (auch: Aktivitätsträger oder leichtgewichtiger Prozess, vereinzelt auch: Faden) bezeichnet in der Informatik einen Ausführungsstrang oder eine Ausführungsreihenfolge in der Abarbeitung eines Programms. Ein Thread ist Teil eines… …   Deutsch Wikipedia

  • Kernel Thread — Ein Thread (auch: Aktivitätsträger oder leichtgewichtiger Prozess, vereinzelt auch: Faden) bezeichnet in der Informatik einen Ausführungsstrang oder eine Ausführungsreihenfolge in der Abarbeitung eines Programms. Ein Thread ist Teil eines… …   Deutsch Wikipedia

  • Prozess (Informatik) — Ein Prozess ist in der Informatik „der Vorgang einer algorithmisch ablaufenden Informationsverarbeitung“. Als Spezialfall „in Betriebssystemen ist ein Prozess ein Vorgang, der durch ein Programm kontrolliert wird, welches zur Ausführung einen… …   Deutsch Wikipedia

  • Monitor (Informatik) — Ein Monitor in der Informatik ist ein programmiersprachliches Konzept zur Synchronisation von Zugriffen zeitlich verschränkt oder parallel laufender Prozesse oder Threads auf gemeinsam genutzten Datenstrukturen oder Ressourcen. Inkonsistente… …   Deutsch Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”