THREADCALL

FreeBASIC-Referenz » Alphabetische Befehlsreferenz » T » THREADCALL

Syntax: THREADCALL Prozedurname [(Parameterliste)]
Typ: Funktion
Kategorie: Multithreading

THREADCALL startet eine Prozedur Ihres Programms als eigenständigen Thread.

THREADCALL arbeitet ähnlich wie THREADCREATE. Wird eine Prozedur mit THREADCALL aufgerufen, so wird sie in einem neuen Thread gestartet und gleichzeitig mit dem Code ausgeführt, von dem sie aufgerufen wurde. Das Betriebssystem erreicht diese Gleichzeitigkeit, indem es die Prozedur einem anderen Prozessor zuweist, sofern einer vorhanden ist, oder indem es die Wartezeiten des Hauptprogramms ausnutzt.

Bevor Sie Ihr Programm beenden, müssen Sie mit THREADWAIT auf die Beendigung aller Threads warten, die von ihm gestartet wurden.

Um mehrere Threads zu synchronisieren, existieren verschiedene Möglichkeiten; sie können entweder über Mutexe aufeinander abgestimmt werden oder auf ein COND-Signal warten. Siehe dazu MUTEXCREATE sowie CONDCREATE.

THREADCALL ist eine einfachere Methode, Threads zu erstellen, und erlaubt die Übergabe von Daten, ohne dass dabei auf globale Variablen oder Pointer zurückgegriffen werden muss. Trotzdem ist die Funktion effizienter und sollte in Programmen verwendet werden, die eine große Zahl an Threads erstellen.
Unter Linux wird die Bibliothek libffi (bzw. das zugehörige devel-Paket) benötigt, um die Funktion verwenden zu können, unter Windows wird die statische Version der Bibliothek mitgeliefert. Da es sich bei libffi um eine externe Bibliothek handelt, sollte die Lizenz beachtet werden.

Obwohl die meisten Prozeduren unterstützt werden, können folgende Prozeduren nicht mit THREADCALL gestartet werden:

Beispiel:

Sub thread(id As String, tlock As Any Ptr, anzahl as Integer = 5)
  For i As Integer = 1 To anzahl
    MutexLock tlock
    Print "Schleife "; id; " befindet sich im Durchlauf Nr. "; i
    MutexUnlock tlock
    Sleep 1
  Next
End Sub

Dim tlock As Any Ptr = MutexCreate()
Dim a As Any Ptr = ThreadCall thread("A", tlock)
Dim b As Any Ptr = ThreadCall thread("B", tlock, 7)
ThreadWait a
ThreadWait b
MutexDestroy tlock
Print "Fertig (und das ohne die Verwendung von DIM SHARED!)"
Sleep

Mögliche Ausgabe:

Schleife B befindet sich im Durchlauf Nr.  1
Schleife A befindet sich im Durchlauf Nr.  1
Schleife B befindet sich im Durchlauf Nr.  2
Schleife A befindet sich im Durchlauf Nr.  2
Schleife B befindet sich im Durchlauf Nr.  3
Schleife A befindet sich im Durchlauf Nr.  3
Schleife B befindet sich im Durchlauf Nr.  4
Schleife A befindet sich im Durchlauf Nr.  4
Schleife B befindet sich im Durchlauf Nr.  5
Schleife A befindet sich im Durchlauf Nr.  5
Schleife B befindet sich im Durchlauf Nr.  6
Schleife B befindet sich im Durchlauf Nr.  7
Fertig (und das ohne die Verwendung von DIM SHARED!)

Unterschiede zu QB: neu in FreeBASIC

Plattformbedingte Unterschiede:

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.24

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht THREADCALL nicht zur Verfügung.

Siehe auch:
THREADCREATE, THREADWAIT, Multithreading