В этом разделе представлен обзор того, что такое pthreads, и почему разработчик может захотеть его использовать.
Он также должен упомянуть о любых крупных предметах в pthreads и ссылки на связанные темы. Поскольку документация для pthreads является новой, вам может потребоваться создать начальные версии этих связанных тем.
Подробные инструкции по настройке или установке 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 также может использоваться для возврата результатов, или указатель на общую структуру данных может быть передан в поток и результаты, хранящиеся там ,