pthreadsKomma igång med pthreads


Anmärkningar

Det här avsnittet ger en översikt över vad pthreads är och varför en utvecklare kanske vill använda den.

Det bör också nämna alla stora ämnen inom pthreads och länka till relaterade ämnen. Eftersom dokumentationen för pthreads är ny kan du behöva skapa initialversioner av relaterade ämnen.

Installation eller installation

Detaljerade instruktioner för att få installerade eller installerade pthreads.

Minimal "Hello World" med 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;
}
 

Överför argument till trådar

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

Hur man sammanställer:

$ gcc -pthread -o hello hello.c
 

Detta skriver ut:

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

Återvänd resultat från tråd

En pekare till en konkret datatyp, konverterad till void * , kan användas för att skicka värden till och returnera resultat från trådfunktionen.

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

I många fall är det onödigt att skicka ett returvärde på detta sätt - till exempel kan utrymme i argumentstrukturen också användas för att returnera resultat, eller en pekare till en delad datastruktur kan skickas till tråden och resultaten lagras där .