Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger

 << zurück
Linux-UNIX-Programmierung von Jürgen Wolf
Das umfassende Handbuch – 2., aktualisierte und erweiterte Auflage 2006
Buch: Linux-UNIX-Programmierung

Linux-UNIX-Programmierung
1216 S., mit CD, 49,90 Euro
Rheinwerk Computing
ISBN 3-89842-749-8
gp Kapitel 10 Threads
  gp 10.1 Unterschiede zwischen Threads und Prozessen
  gp 10.2 Thread-Bibliotheken
  gp 10.3 Kernel- und User-Threads
  gp 10.4 Scheduling und Zustände von Threads
  gp 10.5 Die grundlegenden Funktionen zur Thread–Programmierung
    gp 10.5.1 pthread_create – einen neuen Thread erzeugen
    gp 10.5.2 pthread_exit – einen Thread beenden
    gp 10.5.3 pthread_join – auf das Ende eines Threads warten
    gp 10.5.4 pthread_self – die ID von Threads ermitteln
    gp 10.5.5 pthread_equal – die ID von zwei Threads vergleichen
    gp 10.5.6 pthread_detach – einen Thread unabhängig machen
  gp 10.6 Die Attribute von Threads und das Scheduling
  gp 10.7 Threads synchronisieren
    gp 10.7.1 Mutexe
    gp 10.7.2 Condition-Variablen (Bedingungsvariablen)
    gp 10.7.3 Semaphore
    gp 10.7.4 Weitere Synchronisationstechniken im Überblick
  gp 10.8 Threads abbrechen (canceln)
  gp 10.9 Erzeugen von Thread-spezifischen Daten (TSD-Data)
  gp 10.10 pthread_once – Codeabschnitt einmal ausführen
  gp 10.11 Thread-safe (thread-sichere Funktionen)
  gp 10.12 Threads und Signale
  gp 10.13 Zusammenfassung und Ausblick


Rheinwerk Computing

10.10 pthread_once – Codeabschnitt einmal ausführetoptop

In den Beispielen bisher haben Sie häufig mehrere Threads gestartet. Manchmal tritt aber eine Situation ein, wo man gewisse Vorbereitungen treffen muss – z. B. eine bestimmte Datei anlegen, weil mehrere Threads darauf zugreifen müssen oder man eine Bibliotheksroutine entwickelt. Ist es nicht möglich, solche Vorbereitungen beim Start des Haupt-Threads zu treffen, sondern muss man dies in einem der Neben-Threads machen, benötigt man einen Mechanismus, wo eine Funktion exakt nur einmal ausgeführt wird, egal wie oft und von welchem Thread aus diese aufgerufen wurde. Ein einfaches Beispiel, worauf ich hinauswill:

/* thread18.c */
#include <pthread. h.>
#include <stdio.h>
#include <stdlib.h>
#define MAX_THREADS 3
void thread_once(void) {
   printf("Funktion thread_once() aufgerufen\n");
}
void* thread_func (void* args) {
   printf("Thread %ld wurde gestartet\n", pthread_self());
   thread_once();
   printf("Thread %ld ist fertig gestartet\n",
      pthread_self());
   pthread_exit(NULL);
}
int main (void) {
  int i;
  pthread_t threads[MAX_THREADS];
  /* Threads erzeugen */
  for (i = 0; i < MAX_THREADS; ++i)
    pthread_create (&(threads[i]), NULL, thread_func, NULL);
  /* Auf die Threads warten  */
  for (i = 0; i < MAX_THREADS; ++i)
    pthread_join (threads[i], NULL);
  return EXIT_SUCCESS;
}

Das Programm bei der Ausführung:

$ gcc -o thread18 thread18.c -lpthread
$ ./thread18
Thread -1209418832 wurde gestartet
Funktion thread_once() aufgerufen
Thread -1209418832 ist fertig gestartet
Thread -1217811536 wurde gestartet
Funktion thread_once() aufgerufen
Thread -1217811536 ist fertig gestartet
Thread -1226204240 wurde gestartet
Funktion thread_once() aufgerufen
Thread -1226204240 ist fertig gestartet

Beabsichtigt war in diesem Beispiel, dass die Funktion »thread_once« nur einmal aufgerufen wird. Aber wie das für Thread-Programme eben üblich ist, wird die Funktion bei jedem Thread aufgerufen. Hier kann man zwar mit den Thread-spezifischen Synchronisationen nachhelfen, aber die Thread-Bibliothek bietet Ihnen hier mit der Funktion pthread_once() eine Funktion an, die einen bestimmten Code nur ein einziges Mal ausführt.

#include <pthread. h.>
pthread_once_t once_control = PTHREAD_ONCE_INIT;
int  pthread_once(
pthread_once_t  *once_control, void (*init_routine) (void));

Vor der Ausführung von pthread_once() muss man eine statische Variable mit der Konstante PTHREAD_ONCE_INIT initialisieren, bevor man diese an pthread_once() (erster Parameter) übergibt. Als zweites Argument übergeben Sie pthread_once(), die Funktion, die den einmal auszuführenden Code enthält. Wird dieser einmal auszuführende Code ausgeführt, wird dies in der Variablen once_control vermerkt, so dass diese Funktion kein zweites Mal mehr ausgeführt werden kann. Hierzu das Beispiel »thread18.c« nochmals mit phtread_once():

/* thread19.c */
#include <pthread. h.>
#include <stdio.h>
#include <stdlib.h>
#define MAX_THREADS 3
static pthread_once_t once = PTHREAD_ONCE_INIT;
void thread_once(void) {
   printf("Funktion thread_once() aufgerufen\n");
}
void* thread_func (void* args) {
   printf("Thread %ld wurde gestartet\n", pthread_self());
   pthread_once(&once, thread_once);
   printf("Thread %ld ist fertig gestartet\n",
      pthread_self());
   pthread_exit(NULL);
}
int main (void) {
  int i;
  pthread_t threads[MAX_THREADS];
  /* Threads erzeugen */
  for (i = 0; i < MAX_THREADS; ++i)
    pthread_create (&(threads[i]), NULL, thread_func, NULL);
  /* Auf die Threads warten  */
  for (i = 0; i < MAX_THREADS; ++i)
    pthread_join (threads[i], NULL);
  return EXIT_SUCCESS;
}

Das Programm bei der Ausführung:

$ gcc -o thread19 thread19.c -lpthread
$ ./thread19
Thread -1209418832 wurde gestartet
Funktion thread_once() aufgerufen
Thread -1209418832 ist fertig gestartet
Thread -1217811536 wurde gestartet
Thread -1217811536 ist fertig gestartet
Thread -1226204240 wurde gestartet
Thread -1226204240 ist fertig gestartet

Jetzt wird die mit pthread_once() eingerichtete Funktion tatsächlich nur noch einmal ausgeführt.

 << zurück
  
  Zum Rheinwerk-Shop
Neuauflage: Linux-UNIX-Programmierung
Neuauflage:
Linux-UNIX-
Programmierung

bestellen
 Ihre Meinung?
Wie hat Ihnen das Openbook gefallen?
Ihre Meinung

 Buchtipps
Zum Rheinwerk-Shop: Linux-Server






 Linux-Server


Zum Rheinwerk-Shop: Das Komplettpaket LPIC-1 & LPIC-2






 Das Komplettpaket
 LPIC-1 & LPIC-2


Zum Rheinwerk-Shop: Linux-Hochverfügbarkeit






 Linux-
 Hochverfügbarkeit


Zum Rheinwerk-Shop: Shell-Programmierung






 Shell-
 Programmierung


Zum Rheinwerk-Shop: Linux Handbuch






 Linux Handbuch


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
Info





Copyright © Rheinwerk Verlag GmbH 2006
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern