Looking for pthreads Answers? Try Ask4KnowledgeBase
Looking for pthreads Keywords? Try Ask4Keywords

pthreadsErste Schritte mit pthreads


Bemerkungen

In diesem Abschnitt erhalten Sie einen Überblick darüber, was pthreads ist und warum ein Entwickler es möglicherweise verwenden möchte.

Es sollte auch alle großen Themen in Pthreads erwähnen und auf die verwandten Themen verweisen. Da die Dokumentation für pthreads neu ist, müssen Sie möglicherweise erste Versionen dieser verwandten Themen erstellen.

Installation oder Setup

Detaillierte Anweisungen zum Einrichten oder Installieren von Pthreads.

Minimal "Hello World" mit Pthreads

#include <pthread.h>
#include <stdio.h>
#include <string.h>

/* function to be run as a thread always must have the same signature:
   it has one void* parameter and returns void */
void *threadfunction(void *arg)
{
  printf("Hello, World!\n"); /*printf() is specified as thread-safe as of C11*/
  return 0;
}

int main(void)
{
  pthread_t thread;
  int createerror = pthread_create(&thread, NULL, threadfunction, NULL);
  /*creates a new thread with default attributes and NULL passed as the argument to the start routine*/
  if (!createerror) /*check whether the thread creation was successful*/
    {
      pthread_join(thread, NULL); /*wait until the created thread terminates*/
      return 0;
    }
  fprintf("%s\n", strerror(createerror), stderr);
  return 1;
}
 

Argumente an Threads übergeben

#include <stdio.h>
#include <pthread.h>

void *thread_func(void *arg)
{
    printf("I am thread #%d\n", *(int *)arg);
    return NULL;
}

int main(int argc, char *argv[])
{
    pthread_t t1, t2;
    int i = 1;
    int j = 2;

    /* Create 2 threads t1 and t2 with default attributes which will execute
    function "thread_func()" in their own contexts with specified arguments. */
    pthread_create(&t1, NULL, &thread_func, &i);
    pthread_create(&t2, NULL, &thread_func, &j);

    /* This makes the main thread wait on the death of t1 and t2. */
    pthread_join(t1, NULL);
    pthread_join(t2, NULL);

    printf("In main thread\n");
    return 0;
}
 

So kompilieren Sie:

$ gcc -pthread -o hello hello.c
 

Dies druckt:

I am thread #1
I am thread #2
In main thread
 

Ergebnis vom Thread zurückgeben

Ein Zeiger auf einen konkreten Datentyp, der in void * konvertiert ist, kann verwendet werden, um Werte an die Thread-Funktion zu übergeben und Ergebnisse davon zurückzugeben.

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

struct thread_args
{
    int a;
    double b;
};


struct thread_result
{
    long x;
    double y;
};

void *thread_func(void *args_void)
{
    struct thread_args *args = args_void;
    /* The thread cannot return a pointer to a local variable */
    struct thread_result *res = malloc(sizeof *res);

    res->x  = 10 + args->a;
    res->y = args->a * args->b;
    return res;
}

int main()
{
    pthread_t threadL;
    struct thread_args in = { .a = 10, .b = 3.141592653 };
    void *out_void;
    struct thread_result *out;

    pthread_create(&threadL, NULL, thread_func, &in);
    pthread_join(threadL, &out_void);
    out = out_void;
    printf("out -> x = %ld\tout -> b = %f\n", out->x, out->y);
    free(out);

    return 0;
}
 

In vielen Fällen ist es nicht erforderlich, einen Rückgabewert auf diese Weise zu übergeben. Beispielsweise kann der Speicherplatz im Argument struct verwendet werden, um Ergebnisse zurückzugeben, oder ein Zeiger auf eine gemeinsame Datenstruktur kann an den Thread übergeben und die Ergebnisse dort gespeichert werden .