pthreadsAan de slag met pthreads


Opmerkingen

Deze sectie geeft een overzicht van wat pthreads is en waarom een ontwikkelaar het misschien wil gebruiken.

Het moet ook alle grote onderwerpen binnen pthreads vermelden en naar de gerelateerde onderwerpen verwijzen. Omdat de documentatie voor pthreads nieuw is, moet u mogelijk eerste versies van die gerelateerde onderwerpen maken.

Installatie of instellingen

Gedetailleerde instructies voor het instellen of installeren van pthreads.

Minimale "Hallo wereld" met 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;
}
 

Argumenten doorgeven aan threads

#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;
}
 

Hoe te compileren:

$ gcc -pthread -o hello hello.c
 

Dit drukt af:

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

Retourresultaat van thread

Een aanwijzer naar een concreet gegevenstype, geconverteerd naar void * , kan worden gebruikt om waarden door te geven aan en resultaten te retourneren uit de threadfunctie.

#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 veel gevallen is het niet nodig om op deze manier een retourwaarde door te geven - ruimte in de argumentstructuur kan bijvoorbeeld ook worden gebruikt om resultaten te retourneren of een pointer naar een gedeelde gegevensstructuur kan aan de thread worden doorgegeven en de resultaten worden daar opgeslagen .