pthreadsНачало работы с pthreads


замечания

В этом разделе представлен обзор того, что такое pthreads, и почему разработчик может захотеть его использовать.

Он также должен упомянуть о любых крупных предметах в pthreads и ссылки на связанные темы. Поскольку документация для pthreads является новой, вам может потребоваться создать начальные версии этих связанных тем.

Установка или настройка

Подробные инструкции по настройке или установке pthreads.

Минимальный «Hello World» с 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;
}
 

Передача аргументов в потоки

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

Как скомпилировать:

$ gcc -pthread -o hello hello.c
 

Это печатает:

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

Возвращаемый результат из потока

Указатель на конкретный тип данных, преобразованный в void * , может использоваться для передачи значений и возврата результатов от функции потока.

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

Во многих случаях нет необходимости передавать возвращаемое значение таким образом - например, пространство в аргументе struct также может использоваться для возврата результатов, или указатель на общую структуру данных может быть передан в поток и результаты, хранящиеся там ,